Django queryset для получения значений полей, выбранных по принципу "многие ко многим

У меня есть класс A(Aid,Aname,manytomanyfield) с отношением многие-ко-многим к классу B(Bid,Bname).

У меня есть, например, три строки в A :
Aid,Aname
1,foo
2,bar
3,baz

Например, у меня есть три строки в B:
Bid,Bname
1,foo
2,bar
3,baz

В Django ORM я не вижу класс отношений, который содержит, например:
Помощь,Заявка
1,1
1,2
1,3
2,2
2,3

Мне нужны все строки A, которые соответствуют, например, строке класса B "3,baz".

В django "A.objects.filter(manytomanyfield=B.get(Bname=baz))":
Aid,Aname,Bname
1,foo,baz

Есть ли способ получить все возможные значения связи A с B после фильтрации?
Я хочу:
Aid,Aname,Bname,manytomanyfield
1,foo,baz, "foo,bar,baz"

Я ищу ",".join(B.values_list("Bname", flat=True)), например, в "manytomanyfield".

В django admin, django производит этот результат с новым запросом для каждой строки html-таблицы. Интересно, можем ли мы сделать это с помощью только одного запроса ORM.

Простите за мой английский!

Вы можете .filter(…) [Django-doc] с:

A.objects.filter(manytomanyfield__Bname='baz')

это может получить один и тот же A несколько раз, если A связан несколько раз с B с именем baz или если есть несколько B моделей с name='baz', вы можете добавить .distinct() [Django-doc] для получения каждой A не более одного раза:

A.objects.filter(manytomanyfield__Bname='baz').distinct()

Вы можете получить связанные B с помощью some_a.manytomanyfield.all(), так:

qs = A.objects.filter(manytomanyfield__Bname='baz').prefetch_related('manytomanyfield').distinct()

for a in qs:
    print(a.manytomanyfield.all())
Вернуться на верх