Django - 有效地查询扩展模型

时间:2017-01-22 15:35:50

标签: python django database orm

我有一个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方法不会破坏数据库。我有几千个对象,因此数据库受到了冲击。

干杯,

迪恩

2 个答案:

答案 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