Как объединить 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'
)