带有包含另一个查询集的模型方法的 Django 查询集

Django queryset with Model method containing another queryset

假设我有一个模型 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

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

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

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

我希望我的问题是有道理的——我正在喝第六杯浓缩咖啡,但仍然没有找到减少数据库查询的方法。

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

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

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