Как объединить 2 таблицы в django ORM

У меня есть 2 таблицы. TableA и TableB.

id является первичным ключом в TableB и item_id является внешним ключом в TableA.

Моя задача - найти все items из ТаблицыВ, где id должно совпадать с item_ids.

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

item_ids = list(TableA.objects.filter(is_active=True).\
                               distinct().\
                               values_list('item_id', flat=True))

items = TableB.objects.filter(Q(id__in=item_ids) & \
                              Q(display_name__isnull=False) & \
                              Q(name__isnull=False)).\
                       values("name", "display_name")

Может кто-нибудь помочь мне с запросом?

Вы можете использовать атрибут related_name в определении внешнего ключа элемента. Таким образом, вам не придется гадать, как называется обратное отношение из TableB.

item = models.ForeignKey(TableB, related_name='tablea', on_delete=models.CASCADE)

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

from django.db.models import Q

items = TableB.objects.filter(
  Q(tablea__is_active=True) &
  Q(display_name__isnull=False) &
  Q(name__isnull=False)
).values(
  'name', 'display_name'
).distinct(
  'name', 'display_name'
).order_by(
  'name', 'display_name'
)
Вернуться на верх