【问题标题】:django prefetch_related with filterdjango prefetch_related 与过滤器
【发布时间】:2012-06-17 17:43:09
【问题描述】:

models.py:

class Ingredient(models.Model):
    _est_param = None

    param = models.ManyToManyField(Establishment, blank=True, null=True, related_name='+', through='IngredientParam')

    def est_param(self, establishment):
        if not self._est_param:
            self._est_param, created = self.ingredientparam_set\
                .get_or_create(establishment=establishment)
        return self._est_param

class IngredientParam(models.Model):
    #ingredient params
    active = models.BooleanField(default=False)
    ingredient = models.ForeignKey(Ingredient)
    establishment = models.ForeignKey(Establishment)

我需要使用 Establishment 的参数获取所有成分。首先,我获取Ingredients.objects.all() 并使用所有参数,例如Ingredients.objects.all()[0].est_param(establishment).active。如何使用 django 1.4 prefetch_related 减少 sql 查询?也许我可以使用其他方式为Ingredient 存储单个Establishment 属性?

【问题讨论】:

标签: django django-orm


【解决方案1】:

Django 1.7 添加了 Prefetch 对象,您可以将其放入 prefetch_related 中。它允许您指定应该提供过滤的查询集。目前我在从列表中获取单个(最新)条目时遇到了一些问题,但在尝试获取所有相关条目时它似乎工作得很好。

您还可以查看django-prefetch,它是this question 的一部分,由于措辞大不相同,它似乎与这个问题没有重复。

【讨论】:

    【解决方案2】:

    以下代码将在 2 个查询中获取所有成分及其参数:

    ingredients = Ingredients.objects.all().prefetch_related('ingredientparam_set')
    

    然后您可以访问您感兴趣的参数而无需进一步的数据库查询。

    【讨论】:

    • 此查询将获取所有机构的所有参数,但我只需要一个机构(例如,Establishment.objects.get(id=1))
    • 据我所知,您只能选择带有prefetch_related 的完整参数集,而不是子集。您可以忽略您不感兴趣的参数。执行一个返回比您需要的更多结果的数据库查询比执行多个每个返回一个结果的数据库查询更有效。
    • 如果成分列表大于 Estabslishments,那么Ingredients.objects.all().prefetch_related('ingredientparam_set') 将是一个不错的解决方案。但是如果成分列表小于 Estabslihments,那么最好做一些查询
    猜你喜欢
    • 1970-01-01
    • 2012-06-10
    • 2019-03-16
    • 2016-02-26
    • 2021-08-27
    • 2019-03-03
    • 2016-05-07
    • 2015-08-23
    • 2014-09-01
    相关资源
    最近更新 更多