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())