包含另一个查询集的Model方法的Django查询集

时间:2015-02-19 03:33:37

标签: django django-queryset django-managers

假设我有一个模型MyModel,其属性方法使用另一个模型的查询集。

class OtherModel(models.Model)
    ...

class MyModel(models.Model):
    simple_attr = models.CharField('Yada yada')

    @property
    def complex_attr(self):
        list_other_model = OtherModel.objects.all()
        ...
        # Complex algorithm using queryset from 'OtherModel' and simple_attr
        return result

这会导致get_queryset()上的MyModel方法查询数据库,以便每次为每一行生成list_other_model变量。

这导致我的MyModel ListView生成数百个SQL查询。效率不高。

在使用list_other_model时,如何构建Manager或get_queryset方法来为每行缓存变量MyModel.objects.all()

我希望我的问题有道理 - 我第六次使用浓缩咖啡,但仍未找到减少数据库查询的方法。

1 个答案:

答案 0 :(得分:0)

不确定这是否是最好的方法,但它确实有效。

如果有人发布了更好的答案,我会接受他们的答案。

class OtherModel(models.Model)
    ...

class MyModelManager(models.Manager):
    def get_queryset(self):
        self.model.list_other_model = OtherModel.objects.all()
        return super(MyModelManager, self).get_queryset()

class MyModel(models.Model):
    simple_attr = models.CharField('Yada yada')
    list_other_model = None

    objects = MyModelManager()

    @property
    def complex_attr(self):
        ...
        # Complex algorithm using queryset from 'OtherModel' and simple_attr
        return result