用于从相关查询中列出所有 ForeignKey 对象的 Django 查询

Posted

技术标签:

【中文标题】用于从相关查询中列出所有 ForeignKey 对象的 Django 查询【英文标题】:Django query for listing all ForeignKey objects from related query 【发布时间】:2016-05-27 10:56:56 【问题描述】:

我正在尝试做一个简单的查询,从单个用户对象的所有付款中检索所有产品。

以下是相关模型:

class Payment(models.Model):
    user = models.ForeignKey(User, related_name="payments")
    product= models.ForeignKey(Product)
...

最初我有一个名为user 的用户对象。我可以使用all_payments = user.payments.all() 检索所有付款。

如何扩展查询以检索与 all_payments 关联的所有产品,以获取用户已支付的所有产品的列表?在模板中,我喜欢使用 %for item in products% 遍历列表,而无需将任何付款列表传递到模板中。

我们应该如何更改该查询以从该查询集中删除所有可能的重复产品?

现在我通过循环遍历 all_payments QuerySet 来获取列表,但这感觉真的很糟糕......

【问题讨论】:

【参考方案1】:

您可以使用prefetch_related

user.payments.all().prefetch_related('product')

要在模板中显示,您可以继续使用您的all_payments

% for payment in all_payments %
    % for p in payment.product %
          # do something with the product p #
    % endfor %
% endfor %

【讨论】:

还有select_related 嗯,我得到的不是产品查询集,而是支付对象。 (或我的测试数据中的单一支付对象)。我一定在这里遗漏了一些重要的东西。 @Paapaa - 这不是你想要的吗?为什么需要查询集? 我有一个 Payment 对象列表,但我想要一个 Product 对象列表(查询集?),这样我就可以显示用户曾经购买过的所有产品。 @Paapaa - 但是您不需要查询集来执行此操作,您可以迭代对象吗?这只是使其成为一个 db 查询,而不是我认为的目标 n 查询

以上是关于用于从相关查询中列出所有 ForeignKey 对象的 Django 查询的主要内容,如果未能解决你的问题,请参考以下文章

构造一个 django 查询集,用于对内部连接进行排序

列出表中存在的字段

按外键/相关字段分组 django 查询集

Django:列出一个字段组合其所有唯一值的所有内容

Django - 遵循向后的 ForeignKey,然后是 ForeignKey(查询)

Django对相关一对多对象的聚合查询