如何使用查询集结果Django进行过滤

时间:2015-08-23 12:15:35

标签: django

我想知道是否可以使用queryset对象属性过滤查询集结果。

示例:

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

这应该返回几个对象

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

现在我希望Invoice中的所有数据都与找到的clients.id相对应。

最优化的方法是什么?由于Django是一个强大的框架,我想知道它是否有一个好的和快速的方法来做到这一点,而我不必将主要结果添加到列表并执行for循环。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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 ...)