【问题标题】:Django Prefetch object and only failsDjango Prefetch 对象并且只会失败
【发布时间】:2018-03-29 09:36:41
【问题描述】:

我有 2 个模型产品和类别。它们之间是多对多的关系。

我有以下代码:

在视图中:

context['products']Product.objects.all().prefetch_related(Prefetch('categories', queryset=Category.objects.only('name')))

在模板中:

{% for product in products %}
    {{ product.categories.all.0.name}}

在这种情况下,prefetch_related 被忽略,它在每个产品的类别中执行新的查询。

如果我删除 only,它只会执行 2 个查询

为什么?

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    你不能使用只有 name 字段的查询集,因为 Django 至少需要 product_id 来匹配 Category 对象和 Product - 因为你已经排除了它,Django 每次都会自动进行单独的查询来获取它。这发生在查询时,甚至在它发送到模板的对象之前。

    Category.objects.only('name', 'product_id') 可以工作。

    【讨论】:

    • 错误:类别没有名为 'product_id' 的字段;可能是因为是多对多而不是 FK
    • 在这种情况下,我不确定您是否可以完成这项工作 - 可能有办法,但我不知道它是什么。你确定你真的需要only吗?感觉像是过度优化。
    • 我在模型上有 10 个属性,我只需要一个
    猜你喜欢
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2021-09-02
    • 2021-11-15
    • 2018-12-15
    相关资源
    最近更新 更多