Django高效查询扩展模型

2024-10-06 11:22:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个基本模型(模型。模型),以及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')

问题是基本模型的unicode表示在下拉列表中显示。如果我将unicode方法添加到具有条件的BaseModel类:

^{pr2}$

这将导致查询每个对象的数据库。在

有什么办法让我自己摆脱困境吗?在

本质上,我需要制定一个查询集,它将有效地获取所有的BaseModel对象,当它们在下拉列表中显示它们各自扩展类的unicode方法(从外键字段对象打印字段)时,不要敲击数据库。我有几千个对象,所以数据库会受到影响。在

干杯

迪安


Tags: 对象方法模型数据库列表objectstypeunicode
2条回答

为什么不把一个混杂的袋子交给下拉列表呢。这不再是QuerySet,但下拉列表不会介意:

qs = list(ExtendedModelA.objects.select_related('whatever_fk_needed')) +\
     list(ExtendedModelB.objects.select_related('whatever_fk_needed'))

无论选择哪个实例,它的id将与其BaseModel实例相同。在

您使用的是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')

编辑

您可以使用双下划线表示法来访问相关模型上的更深的字段。例如

^{pr2}$

相关问题 更多 >