繁体   English   中英

Django-有效查询扩展模型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM