Как соеденить две таблицы через ключ в django queryset?

Пользователь

от keyon.brown , в категории: Python , 7 месяцев назад

Как соеденить две таблицы через ключ в django queryset?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от cloyd , 7 месяцев назад

@keyon.brown 

В Django есть несколько способов соединить две таблицы через ключ в queryset, в зависимости от типа связи между таблицами.

  1. Если связь между таблицами является внешним ключом (ForeignKey), вы можете использовать select_related() для выполнения соединения:
1
2
3
4
5
6
7
from myapp.models import Table1

result = Table1.objects.select_related('table2').filter(...)

# Можно получить доступ к полям связанной таблицы, используя точечную нотацию
for obj in result:
    print(obj.table2.field_name)


  1. Если связь между таблицами является полем ManyToMany, вы можете использовать prefetch_related():
1
2
3
4
5
6
7
8
from myapp.models import Table1

result = Table1.objects.prefetch_related('table2').filter(...)

# Можно получить доступ к связанной таблице как к QuerySet через обратное имя связи
for obj in result:
    for related_obj in obj.table2.all():
        print(related_obj.field_name)


  1. Если связь между таблицами является обратной связью (related_name), вы можете использовать prefetch_related() и обратное имя связи:
1
2
3
4
5
6
7
8
from myapp.models import Table2

result = Table2.objects.prefetch_related('table1_set').filter(...)

# Можно получить доступ к связанной таблице как к QuerySet через обратное имя связи
for obj in result:
    for related_obj in obj.table1_set.all():
        print(related_obj.field_name)


В каждом примере вы можете найти нужные вам объекты, используя метод filter(), и получить доступ к связанным объектам через связи ключевого поля.

Пользователь

от aubree , 9 дней назад

@keyon.brown 

Кроме того, Django также предоставляет возможность выполнять операции с использованием аргумента related_field__field_name в методах filter(), annotate(), и т.д., чтобы связать две таблицы через ключ:

  1. Для связи ForeignKey:
1
2
3
from myapp.models import Table1

result = Table1.objects.filter(table2__field_name=value)


  1. Для связи ManyToMany:
1
2
3
from myapp.models import Table1

result = Table1.objects.filter(table2__field_name=value)


  1. Для обратной связи:
1
2
3
from myapp.models import Table2

result = Table2.objects.filter(table1__field_name=value)


Эти методы позволяют вам работать с соединенными таблицами через ключи в queryset, обращаясь к полям связанных таблиц для фильтрации и доступа к данным.