我想知道是否可以使用queryset对象属性过滤查询集结果。
示例:
clients = Client.objects.filter(name__contains=search)
这应该返回几个对象
result = Invoice.objects.filter(client_id=clients.id)
现在我希望Invoice中的所有数据都与找到的clients.id相对应。
最优化的方法是什么?由于Django是一个强大的框架,我想知道它是否有一个好的和快速的方法来做到这一点,而我不必将主要结果添加到列表并执行for循环。
答案 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 ...)