我有一个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方法不会破坏数据库。我有几千个对象,因此数据库受到了冲击。
干杯,
迪恩
答案 0 :(得分:1)
您正在使用AuthServiceProvider
,这很好。我认为您可以使用select_related
来优化查询,这实际上允许您在此情况下过滤 类型1或类型2。
Q
修改强>
您可以使用双下划线表示法来访问相关模型上的更深字段。例如。
from django.db.models import Q
BaseModel.objects.filter(Q(type=1) | Q(type=2)).select_related('extendedmodela').select_related('extendedmodelb')
答案 1 :(得分:0)
为什么不将混合包传递到下拉列表中。这不再是QuerySet
,但下拉列表不会介意:
qs = list(ExtendedModelA.objects.select_related('whatever_fk_needed')) +\
list(ExtendedModelB.objects.select_related('whatever_fk_needed'))
无论选择何种实例,都会与id
实例具有相同的BaseModel
。