我有以下三个模型,其中“预算”和“销售”均包含客户的外键:
class Customer(models.Model):
name = models.CharField(max_length=45)
# ...
class Budget(models.Model):
customer = models.ForeignKey(Customer, on_delete=models.PROTECT)
# ...
class Sale(models.Model):
customer = models.ForeignKey(Customer, on_delete=models.PROTECT)
# ...
我想获取一个同时存在Budget和Sale的所有Customer对象的queryset。最初,我尝试获取所有Budget和Sale对象的customer字段的交集:
customers = {
budget.customer for budget in Budget.objects.all()
} & {
sale.customer for sale in Sale.objects.all()
}
这将返回正确的对象,但是随着数据库大小的增加,效率将变得非常低下。
如何以更有效的方式检索这些对象?谢谢你的帮助!
您可以使用以下过滤器:
Customer.objects.filter(
budget__isnull=False,
sale__isnull=False
).distinct()
Django可以ForeignKey
反向执行。它使用related_query_name=…
参数[Django-doc]作为关系的名称。如果未指定,则使用related_name=…
[Django-doc]参数,如果未指定,则使用小写的模型名称,因此budget
和sale
。我们在这里做LEFT OUTER JOIN
的SBudget
和Sale
表,并检查是否两个有一个非空行。Django ORM可能会将其优化为INNER JOIN
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句