2012-01-11 29 views
6

Tôi nhận được một bộ truy vấn cho một mô hình nhất định và tôi muốn nhận phần bổ sung của nó, tức là tất cả các trường hợp của mô hình đó là không phải trong bộ truy vấn đã nói ở trên.Django: Nhận thêm bộ truy vấn

Tôi có thể làm như thế nào?

+0

Nó sẽ giúp bạn có chuỗi truy vấn Django mà bạn muốn bổ sung, để cung cấp cho bạn cách chính xác nhất để nhận được phần bổ sung đó. –

+0

Tôi muốn một cái gì đó mà làm việc cho bất kỳ queryset. –

Trả lời

10

giải pháp ngắn

qs = Model.objects.filter(...) # qs with objects to exclude 
result = Model.objects.exclude(pk__in=qs.values_list('pk', flat=True)) 

Nhiều giải pháp DRY

Tuy nhiên, nếu bạn muốn sử dụng logic nhiều lần, tôi sẽ đề nghị để đóng gói nó trong một phương pháp. Dưới đây là ví dụ mà tôi đã sử dụng trong bộ truy vấn tùy chỉnh:

class QuerysetUtils: 
    def get_queryset_complement(self, method): 
     return self.exclude(pk__in=method().values_list('pk', flat=True)) 


class ExpirableQueryset(QuerysetUtils, models.query.QuerySet): 
    def expired(self): 
     return self.filter(expiration__lte=timezone.now()) 

    def unexpired(self): 
     return self.get_queryset_complement(self.expired) 
+2

lưu ý rằng điều này được thực thi dưới dạng truy vấn phụ, nghĩa là danh sách tất cả các id cần loại trừ sẽ không bao giờ được tạo (nếu không sẽ là hiệu suất tiềm năng) – second

+2

Đây có phải là giải pháp gọn gàng nhất không? –

+0

Có thể có một cái tốt hơn cho trường hợp sử dụng của bạn nhưng sau đó nó sẽ hữu ích, như @Chris Pratt đã nói, rằng bạn chỉ cho chúng tôi một số mã số. –

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