2010-02-03 11 views
21

Tôi biết cách xây dựng bộ lọc và đối tượng Q trong django, nhưng tôi không biết cách loại bỏ các toán tử mà API cung cấp, ví dụ cho toán tử chứa tôi muốn một cái gì đó như không chứa.Phủ nhận truy vấn Django

ví dụ:

q=Q(name__notcontains="SomeString") 

Điều này sẽ cho tôi tất cả các đối tượng có tên không chứa "SomeString".

Có một số cú pháp mà tôi đang thiếu không?

Thankyou.

Trả lời

49

Bạn có thể sử dụng exclude() ở vị trí của filter():

Entry.objects.exclude(name__contains="SomeString") 

("cho tôi tất cả các mục NGOẠI TRỪ những người có names chứa "SomeString")

Và khi giao dịch với Q đối tượng bạn có thể sử dụng" ~ Ví dụ câu lệnh sau có nghĩa là "cho tôi tất cả các mục có names chứa" Elephant ", nhưng không chứa" SomeString ":

Entry.objects.filter(Q(name__contains="Elephant") & ~Q(name__contains="SomeString")) 

Trong một số trường hợp, bạn có thể muốn sử dụng cả hai phương pháp:

Entry.objects.exclude(Q(name__contains="Elephant") & ~Q(name__contains="SomeString")) 

("cho tôi tất cả các mục, TRỪ những người có names chứa "Elephant", nhưng KHÔNG chứa "SomeString")

3

Đây là số QuerySet API reference. exclude dường như làm những gì bạn muốn.

+0

Tuyệt vời! đó là chính xác những gì tôi cần, mặc dù nó không thể được sử dụng bên trong một đối tượng Q, người ta có thể chỉ cần chuỗi các bộ lọc với nhau: q = Q (title__contains = "SomeTerm") TheModel.objects.filter (q) .exludlud (title__contains = "SomeTermWeDontWant") Cảm ơn! –

1

Hoặc sử dụng exclude như Hank đề xuất hoặc, đối với trường hợp cụ thể contains, hãy sử dụng Q (name__regex = r '! (SomeString)') nếu bạn thực sự thực sự cần sử dụng filter. Được cảnh báo rằng mặc dù regex không phải là cơ sở dữ liệu bất khả tri, hãy kiểm tra xem cú pháp nào mà db của bạn hỗ trợ trước tiên.