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?
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?
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)
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
Đây có phải là giải pháp gọn gàng nhất không? –
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ố. –
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 đó. –
Tôi muốn một cái gì đó mà làm việc cho bất kỳ queryset. –