带有包含另一个查询集的模型方法的 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
假设我有一个模型 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