使用ORM djang在(select..)中选择

2024-09-30 20:21:37 发布

您现在位置:Python中文网/ 问答频道 /正文

如何查询

select  name where id in (select id from ...)

使用Django ORM?我想我可以用一些循环来获得一些结果,而另一个循环用于,为了使用这个结果,但是我认为这不是实际的工作,更简单的是生成一个查询sql,我认为在python中使这个应该在python中更简单

我有这些型号:

^{pr2}$

我需要得到付款的发票过滤器按商店的身份证,付款日期。 我在mysql中使用select in (select ...)进行这个查询。这是一个简单的查询,但使用django orm进行了一些类似的查询,我只想做一些循环,但我不喜欢这个想法:

invoiceXstore = invoice.objects.filter(local=3)

for a in invoiceXstore:
    payments = invoicePayments.objects.filter(invoice=a.id,
                                              date__range=["2016-05-01", "2016-05-06"])

Tags: djangonameinfromidsqlobjectsorm
2条回答

mysql原始查询是一个子查询。在

select  name where id in (select id from ...)

在mysql中,这通常比内部联接(reference:[http://dev.mysql.com/doc/refman/5.7/en/rewriting-subqueries.html])慢,因此您可以将原始查询重写为一个类似于1的内部联接。在

^{pr2}$

然后可以使用WHERE子句应用筛选。在

您尝试过的循环查询方法确实有效,但不建议使用,因为它会导致执行大量查询。你可以这样做。在

InvoicePayments.objects.filter(invoice__local=3, 
                                      date__range=("2016-05-01", "2016-05-06"))

我不太清楚“本地”代表什么,因为您的模型没有显示任何类似的字段。请使用正确的字段更新模型或根据需要编辑查询。在

若要倾斜大约{a3},请参阅此https://docs.djangoproject.com/en/1.9/ref/models/querysets/#range

可以在Django ORM中使用双下划线(__)遍历ForeignKey关系。例如,您的查询可以实现为:

payments = invoicePayments.objects.filter(invoice__store_id=3, 
                                          date__range=["2016-05-01", "2016-05-06"])

我猜你在这里发帖之前把你的课程改名为英语。在这种情况下,您可能需要将第一部分更改为factura__local=3。在

作为补充说明,建议将您的模型类重命名为InvoicePayments(大写I),以更符合PEP8。在

相关问题 更多 >