2015-08-23 88 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可以用这样的对象工作。真的很高兴知道。感谢你们! 该查询看起来有点奇怪,因为我只有一个字段只有发票号码或客户名称,这就是为什么我必须通过两者进行排序。 –