0

我有以下 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

uuidfield 是跨不同模型的公共字段,并且在它们之间是唯一的。上面代码的想法是获取不同模型的行数,当它为正时,然后返回实际查询集,该查询集将在评估时返回必要的实例。所以在更糟糕的情况下,我们将对len(entity_classes)结果查询集评估执行 SELECT statements + 1 select。

问题是:是否可以使用 django orm 以比我更有效的方式通过一个公共字段过滤不同的模型?

4

1 回答 1

1

首先,尝试直接回答您的问题:鉴于您所描述的,我不知道检查每张桌子的任何方法。如果您对此进行索引uuid肯定会加快查询速度。另外,使用exists()代替count().

但是在所有表中都是唯一的这一事实uuid可能表明您应该重新组织架构。如果您不能完全放弃这个想法,请考虑从您的用户模型链接到一个新模型,该模型同时指定相应行的表和主键。

Django 有一个内置的方法:contenttypes框架。从文档中:

将您自己的模型中的外键添加到 ContentType 可以让您的模型有效地将自身绑定到另一个模型类......正常的 ForeignKey 只能“指向”另一个模型...... contenttypes 应用程序提供了一个特殊字段type (GenericForeignKey) 可以解决这个问题并允许与任何模型建立关系。

于 2013-08-22T06:39:24.737 回答