将字典列表中存在的多个 id 与模型 django 的 id 进行比较

Posted

技术标签:

【中文标题】将字典列表中存在的多个 id 与模型 django 的 id 进行比较【英文标题】:Compare mutiple ids present in list of dictionaries with the ids of model django 【发布时间】:2021-06-01 23:33:31 【问题描述】:

如何进行高效的 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

有没有什么方法可以通过一个查询或更有效地得到这个?

【问题讨论】:

【参考方案1】:

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

products = Product.objects.filter(<b>productorder__isnull=False</b>)<b>.distinct()</b>

这里的productsProducts 中的QuerySet,其中至少有一个相关的ProductOrder

之所以有效,是因为我们在ProductOrder 表上创建了一个LEFT OUTER JOIN,然后检查ProductOrder 是否不是NULL。我们使用.distinct() [Django-doc] 来防止像ProductOrders 那样多次检索Product。可能 Django ORM 会注意到 __isnull=False 约束,并将其优化为 INNER JOIN

【讨论】:

知道了,而且更简单!

以上是关于将字典列表中存在的多个 id 与模型 django 的 id 进行比较的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Django QuerySet 转换为字典列表?

Django 查询聚合成字典列表

如何在 django admin 中显示多个模型的更改列表?

如何使用一个键将多个列表值创建到python中的字典中?

Django:将整个模型对象集转换为单个字典

django模型,如何动态设置查询的字段?