1

如何进行有效的 django orm 查询,它将字典列表中的 id 与其他模型中作为外键的 id 进行比较,例如我有两个模型

Product:

product_name=models.CharField(max_length=20)

ProductOrder:

order_status=models.BooleanField()
product=models.ForeignKey(Product,on_delete=models.CASCADE)

现在我想提取产品订单中存在的所有产品。

在简单的查询中,我可以这样做:

prod=ProductOrder.objects.all()
products=Product.objects.all()
for prod in prod:
  for products in products:
   if prod.product==products.id:
        # save product

有没有办法通过一个查询或更有效地得到这个?

4

1 回答 1

1

您可以使用以下方式过滤:

products = Product.objects.filter(productorder__isnull=False).distinct()

products是一个QuerySetof Products ,其中至少有一个相关的ProductOrder

这是有效的,因为我们LEFT OUTER JOINProductOrder桌子上做了 a 然后检查是否ProductOrder不是NULL。我们使用.distinct()[Django-doc]来防止检索 a 的Product次数与ProductOrders 的次数相同。Django ORM 可能会注意到__isnull=False约束,并将其优化为INNER JOIN.

于 2021-03-03T11:29:02.973 回答