2015-08-23 87 views
0

我想知道是否有可能使用queryset對象屬性過濾查詢集結果。如何使用查詢集結果做一個過濾器Django

例子:

clients = Client.objects.filter(name__contains=search) 

這應返回幾個對象

result = Invoice.objects.filter(client_id=clients.id) 

現在我希望所有的內部發票對應於發現clients.id的數據。

什麼是最優化的方法呢?由於Django是一個強大的框架,我想知道它是否有一個好的和快速的方法來做到這一點,而不必將主要結果添加到列表中並執行for循環。

回答

1

你甚至都不需要從客戶提取ID,這會工作得很好:

clients = Client.objects.filter(name__contains=search) 
result = Invoices.objects.filter(client__in=clients) 

這將導致SQL查詢:

SELECT * FROM invoices WHERE result.client_id IN (SELECT `id` FROM `client` WHERE ...) 
2

您可以通過直接過濾使用查找

result = Invoice.objects.filter(client__name__contains=search) 

發票或者,你可以找到所有客戶端,提取的ID,並通過這些ID過濾發票做到這一點。

clients = Client.objects.filter(**your_crazy_search).values_list('id', flat=True).all() 
result = Invoices.objects.filter(client_id__in=clients_id) 
+2

第二個例子產生2個查詢無緣無故,你可以這麼做:'Invoices.objects.filter(client__in = Client.objects.filter(** your_crazy_search))'。 Django會根據需要生成一個子查詢。 – spectras

+0

謝謝你,你是對的。但在某些情況下,2個查詢優於1個帶有子查詢的查詢。 – Akisame

+0

這完全是我想要的。我不知道Django可以用這樣的對象工作。真的很高興知道。感謝你們! 該查詢看起來有點奇怪,因爲我只有一個字段只有發票號碼或客戶名稱,這就是爲什麼我必須通過兩者進行排序。 –