通过django中的一个公共字段过滤不同的模型

时间:2013-08-21 19:43:48

标签: django django-models

我有以下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以一种比我更有效的方式通过一个公共字段过滤不同的模型?

1 个答案:

答案 0 :(得分:1)

首先,试着直接回答你的问题:鉴于你所描述的内容,我不知道如何检查每张桌子。如果您在uuid上编制索引,肯定会加快查询速度。另外,请使用exists()代替count()

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

Django有一种内置的方式:contenttypes框架。来自documentation

  

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