如何在Django中仅使用一个查询来查询2个不同的表?

时间:2019-06-04 20:48:10

标签: django django-models django-orm

我有两个名为OneTwo的模型。两种模型都有一个名为producer的属性。我正在使用以下代码查询它们:

>>> from itertools import chain
>>> from django.db import connection
>>> producer = 'something'
>>> a = One.objects.filter(producer=producer)
>>> b = Two.objects.filter(producer=producer)
>>> results = list(chain(a, b))
>>> len(connection.queries)
2

不幸的是,如长度所示,这种方法两次命中我的数据库。我如何仅使用一个查询就能做到这一点。我有很多不同的模型,我想一次在视图中查询所有模型。一次命中数据库将极大地提高性能。我不需要排序任何东西,所有模型的过滤器本身都是相同的。

编辑:由于下面的回答,我觉得添加它很明智,我的模型如下所示:

class Number(models.Model):
     producer = models.CharField(max_length=255)

     class Meta:
         abstract = True

class One(Number):
     ...

class Two(Number):
     ...

1 个答案:

答案 0 :(得分:1)

据我所知,没有办法直接实现这一目标。

但是,一种可行的方法是以一种方式构建模型,使它们都从其继承的模型共享该字段。例如:

class Number(models.Model):
    # common fields among objects of type One, Two, etc
    producer = ...

class One(Number):
    # other exclusive fields specifically for objects of type One

class Two(Number):
    # other exclusive fields specifically for objects of type Two

然后,您可以直接使用{p>

Number

获取所有对象的所有结果,无论它们是Number.objects.filter(producer=producer) 还是One类型。

尽管请注意,进行两个查询以从两个表中获取数据不一定是一件坏事,并且除非最终查询的数量很大/不同的模型之间确实有很多共同点,否则可能不会值得麻烦。