[英]Django - Query extended models effeciently
我有一个BaseModel(models.Model)和ExtendedModelA(BaseModel)和ExtendedModelB(BaseModel)。 ExtendedModelA和ExtendedModelB都具有其他模型的外键字段。 他们的unicode方法从此与外键相关的模型返回一个字段。
我有一个下拉菜单,我想用BaseModel对象(自然包括ExtendedModelA和ExtendedModelB对象)填充。 为此,我需要一个查询集,该查询集将获取所有扩展对象(类型A和B)及其相关对象。
我有一个合并的查询集:
queryset = BaseModel.objects.filter(type=1).select_related('extendedmodela') | BaseModel.objects.filter(type=2).select_related('extendedmodelb')
麻烦的是,下拉列表中显示了BaseModel的unicode表示形式。 如果我将unicode方法添加到具有条件的BaseModel类中:
if hasattr(self, extendedmodela):
return self.extendedmodela.__unicode__()
else:
return self.extendedmodelb.__unicode__()
这导致查询数据库中的每个对象。
任何人关于如何使自己摆脱困境的任何想法吗?
从本质上讲,我需要制定一个查询集,该查询集将有效地获取所有BaseModel对象,并且当它们在下拉列表中显示时,其相应扩展类的unicode方法(从外键字段对象打印字段)不会对数据库产生冲击。 我有数千个对象,因此数据库受到了很大的冲击。
干杯,
院长
您正在使用select_related
,这很好。 我想你可以通过使用优化您的查询Q
,基本上可以过滤对1型或 2型在这种情况下。
from django.db.models import Q
BaseModel.objects.filter(Q(type=1) | Q(type=2)).select_related('extendedmodela').select_related('extendedmodelb')
编辑
您可以使用双下划线符号来访问相关模型上的更深字段。 例如。
.select_related('extendedmodela', 'extendedmodela__fkfieldname')
为什么不将杂物箱传递给下拉菜单。 这不再是QuerySet
,但是下拉列表不介意:
qs = list(ExtendedModelA.objects.select_related('whatever_fk_needed')) +\
list(ExtendedModelB.objects.select_related('whatever_fk_needed'))
无论选择BaseModel
实例,其id
与其BaseModel
实例相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.