我有两个名为One
和Two
的模型。两种模型都有一个名为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):
...
答案 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
类型。
尽管请注意,进行两个查询以从两个表中获取数据不一定是一件坏事,并且除非最终查询的数量很大/不同的模型之间确实有很多共同点,否则可能不会值得麻烦。