我有以下django模型管理器:
class EntityManager(models.Manager):
...
def filter(self, uuid, *args, **kwargs):
entity_qs = EmptyQuerySet()
for Model in entity_classes:
count = Model.objects.filter(uuid=uuid, *args, **kwargs).count()
if count:
entity_qs = Model.objects.filter(uuid=uuid, *args, **kwargs)
break
return entity_qs
uuid
字段是跨不同模型的公共字段,它们之间是唯一的。的想法
上面的代码是获取不同模型的行数,当它为正数时,返回实际的查询集,它将在评估时返回必要的实例。因此,在更糟糕的情况下,我们将对结果查询集评估进行len(entity_classes)
SELECT语句+ 1选择。
问题是:是否可以使用django orm以一种比我更有效的方式通过一个公共字段过滤不同的模型?
答案 0 :(得分:1)
首先,试着直接回答你的问题:鉴于你所描述的内容,我不知道如何检查每张桌子。如果您在uuid
上编制索引,肯定会加快查询速度。另外,请使用exists()
代替count()
。
但是uuid
在所有表中都是唯一的这一事实可能表明您应该重新组织您的架构。如果您无法完全取消这个想法,请考虑从您的用户模型链接到指定相应行的表和主键的新模型。
Django有一种内置的方式:contenttypes
框架。来自documentation:
将您自己的某个模型中的外键添加到ContentType允许您的模型 有效地将自己绑定到另一个模型类....正常的ForeignKey只能 “指向”另一个模型.... contenttypes应用程序提供了一个特殊字段 type(GenericForeignKey),它可以解决这个问题并允许关系 任何型号。