2013-05-09 25 views
7

Tôi tự hỏi cách tốt nhất để lặp qua bộ truy vấn Django trong khi xóa các đối tượng trong Queryset là gì? Ví dụ: giả sử bạn có một bảng nhật ký với các mục nhập tại các thời điểm cụ thể và bạn muốn lưu trữ chúng để không có quá 1 mục nhập mỗi 5 phút. Tôi biết điều này có thể sai, nhưng đây là loại gì tôi sẽ cho:Lặp lại trên một bộ truy vấn Django trong khi xóa các đối tượng trong cùng một QuerySet

toarchive = Log.objects.all().order_by("-date") 
start = toarchive[0].date 
interval = start - datetime.timedelta(minutes=5) 
for entry in toarchive[1:]:   
    if entry.date > interval: 
     entry.delete() 
    else: 
     interval = entry.date - datetime.timedelta(minutes=5) 
+3

Điều này hợp lệ, bạn có thể xóa các đối tượng theo cách đó. – Rohan

+0

Sử dụng delete() khi lặp trên queryset như thế, giữ một reccord trống khi tôi đi đến trang quản trị của mô hình. Dường như đối tượng không bị xóa hoàn toàn. Chuyện gì vậy? –

Trả lời

0

queryset có một phương pháp delete rằng sẽ xóa tất cả các kết quả của queryset đó. Ví dụ bạn đã cho

toarchive.filter(date__gt=interval).delete() 

sẽ hoạt động. Tuy nhiên, nếu bạn đang thực hiện thử nghiệm không thể thực hiện trong bộ lọc, phương pháp bạn mô tả có lẽ là tốt nhất.

+0

Cảm ơn bạn đã phản hồi! Tôi biết rằng phương pháp này là có thể quá. Tuy nhiên trong trường hợp này tôi không nghĩ rằng sẽ làm việc, bởi vì điều kiện xóa là tương đối giữa các mục trong QuerySet. Tôi đoán những gì tôi muốn biết nhiều hơn nói chung là, tôi sẽ chạy vào vấn đề nếu tôi xóa các đối tượng từ QuerySet, trong khi tôi lặp qua nó. – user1630866

+0

Bạn nói đúng, tôi không chú ý đến mệnh đề 'else' ở đó. Tôi đã không thử nghiệm nó, nhưng xóa các đối tượng trong một QuerySet nên được an toàn, bởi vì 'xóa' chỉ vấn đề truy vấn xóa SQL, nó không ảnh hưởng đến các đối tượng mô hình trong bộ nhớ. – Will

+0

điều này sẽ phá hủy mục nhập cơ sở dữ liệu? hoặc chỉ xóa nó khỏi bộ truy vấn? – jeff

3

Vì vậy, tôi đoán tôi đã trả lời câu hỏi của riêng mình bằng cách hỏi nó, nếu có ai khác tò mò. Tôi nghĩ rằng sẽ có một vấn đề khi xóa các đối tượng trong khi lặp lại chúng, nhưng không có. Đoạn mã trong câu hỏi là đúng cách để làm điều đó.

+1

Làm cách nào để xóa phần tử khỏi tập hợp truy vấn thay vì xóa đối tượng sau khi tôi đã thực hiện thao tác lọc? –

Các vấn đề liên quan