Как запросить 2 разные таблицы только с одним запросом в Django? - PullRequest
0 голосов
/ 04 июня 2019

У меня есть две модели с именами 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):
     ...

1 Ответ

1 голос
/ 04 июня 2019

Насколько я знаю, нет способа напрямую достичь этого.

Один из подходов, который может сработать, заключается в том, чтобы построить ваши модели таким образом, чтобы они оба совместно использовали это поле из модели, которую они наследовали. Например:

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

Тогда вы сможете запросить модель Number напрямую с помощью

Number.objects.filter(producer=producer)

для получения всех результатов для всех объектов, будь то тип One или Two.

Хотя обратите внимание, что выполнение двух запросов для получения данных из двух таблиц не обязательно является плохой вещью, и, если количество запросов, которые вы в итоге получаете, значительно велико / у разных моделей много общего, это может быть не так Стоит хлопот.

...