假设我有一个模型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()
?
我希望我的问题有道理 - 我第六次使用浓缩咖啡,但仍未找到减少数据库查询的方法。
答案 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