2010-12-10 40 views
50

Tôi có mô hình Django với hai phương pháp quản lý tùy chỉnh. Mỗi trả về một tập hợp con khác nhau của các đối tượng của mô hình, dựa trên một thuộc tính khác của đối tượng.Làm thế nào tôi có thể tìm thấy sự kết hợp của hai truy vấn Django?

Có cách nào để nhận một bộ truy vấn hay chỉ một danh sách các đối tượng, đó là sự kết hợp của các queryset được trả về bởi mỗi phương thức của người quản lý?

+2

(Từ câu trả lời đã xóa) Xem câu hỏi này cho biến thể hoạt động với QuerySets từ các Mô hình khác nhau: http://stackoverflow.com/questions/431628/how-to-combine-2-or-more-querysets-in -a-django-view – rnevius

+1

Bắt đầu từ phiên bản 1.11, bộ truy vấn django có phương thức liên kết nội tuyến. Tôi đã thêm nó như là một câu trả lời cho tham khảo trong tương lai –

Trả lời

127

này hoạt động và trông hơi bụi:

records = query1 | query2 

Nếu bạn không muốn bản sao, sau đó bạn sẽ cần phải thêm .distinct():

records = (query1 | query2).distinct() 
+4

Trong khi câu trả lời được chấp nhận trả về một công đoàn có thể lặp lại (danh sách chính xác), như OP đã hỏi, phương thức này trả về một liên kết thực sự của các queryset. Queryset này có thể được vận hành trên xa hơn, đó là mong muốn trong nhiều trường hợp. –

+4

Do lỗi Django, cấu trúc này đôi khi có thể trả lại kết quả không chính xác khi xử lý 'ManyToManyField's. Ví dụ, đôi khi bạn sẽ thấy rằng 'records.count()' sẽ lớn hơn 'query1.count() + query2.count()', điều này rõ ràng là không chính xác. – Jian

+4

@Jian bạn có thể làm rõ phiên bản django với lỗi và liên kết đến vấn đề djangoproject không? – IMFletcher

16

Bắt đầu từ version 1.11, queryset django có một phương thức liên kết nội tuyến.

q = q1.union(q2) #q will contain all unique records of q1 + q2 
q = q1.union(q2, all=True) #q will contain all records of q1 + q2 including duplicates 
q = q1.union(q2,q3) # more than 2 queryset union 

Xem ví dụ blog post về điều này để biết thêm ví dụ.

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