2009-04-20 50 views
30

Làm cách nào để tạo bộ lọc "AND" để truy xuất đối tượng trong Django? ví dụ: tôi muốn truy xuất một hàng có sự kết hợp của hai từ trong một trường duy nhất.Làm cách nào để sử dụng VÀ trong bộ lọc Django?

Ví dụ truy vấn SQL sau đây không chính xác điều đó khi tôi chạy nó trên Cơ sở dữ liệu mysql:

select * from myapp_question 
where ((question like '%software%') and (question like '%java%')) 

Làm thế nào để bạn thực hiện điều này trong Django sử dụng bộ lọc?

Trả lời

59
mymodel.objects.filter(first_name__icontains="Foo", first_name__icontains="Bar") 

cập nhật: thời gian dài kể từ khi tôi viết câu trả lời này và thực hiện một số django, nhưng tôi chắc chắn đến ngày này các phương pháp tốt nhất là sử dụng phương pháp đối tượng Q như David Berger cho thấy ở đây: stackoverflow.com/ a/770078/63097

+3

Điều này làm _not_ phù hợp với tôi ở Django 1.6 và Postgres. Tôi nhận được một "SyntaxError: đối số từ khóa lặp đi lặp lại" bất cứ khi nào có hai hoặc nhiều từ khóa giống nhau. Chỉ có giải pháp với Q của David Berger hoạt động. – margusholland

+0

@margusholland Câu trả lời phù hợp với tôi với Django 1.6 & Postgres. Bạn có thể đăng truy vấn của mình không. Nó là chính thức như phương pháp đối tượng Q. https://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships – Medorator

+1

Tôi có một quốc gia có kiểu mã quốc gia ngắn (cc_short): >>> quốc gia = Country.objects.filter (cc_short__icontains = 'A', cc_short__icontains = 'B') Tệp "", dòng 1 SyntaxError: đối số từ khóa lặp lại – margusholland

10

Bạn có thể chuỗi lọc biểu thức trong Django:

q = Question.objects.filter(question__contains='software').filter(question__contains='java') 

Bạn có thể tìm thêm thông tin trong các tài liệu Django tại "Chaining Filters".

+2

Câu trả lời này có thể cho bạn kết quả sai tùy thuộc vào kịch bản của bạn. Sử dụng ',' trong bộ lọc lọc so với chuỗi có thể có kết quả khác nhau. Đọc thêm: [SO Trả lời] (http://stackoverflow.com/a/11025652/781695) & [Tài liệu chính thức] (https://docs.djangoproject.com/en/dev/topics/db/queries/#spanning -multi-valued-relationship) – Medorator

57

Đối triệt để vì lợi ích, chúng ta hãy chỉ đề cập đến phương pháp Q đối tượng:

from django.db.models import Q 
criterion1 = Q(question__contains="software") 
criterion2 = Q(question__contains="java") 
q = Question.objects.filter(criterion1 & criterion2) 

Lưu ý các câu trả lời khác ở đây là đơn giản và thích nghi tốt hơn đối với trường hợp sử dụng của bạn, nhưng nếu bất cứ ai với một vấn đề tương tự nhưng hơi phức tạp hơn (chẳng hạn như cần "không" hoặc "hoặc") thấy điều này, thật tốt khi có tham chiếu ngay tại đây.

+0

Rất thú vị! –

+0

Chỉ muốn đề cập đến nhận xét của bạn đã giúp tôi. Cảm ơn! – Alfonsol

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