#django #django-orm #manytomanyfield #django-select-related
#джанго #джанго-орм #manytomanyfield #django-выбор, связанный с
Вопрос:
У меня есть приложение Django с моделью A
с ManyToManyField
bees
моделью to B
:
from django.db import models class A(models.Model): bees = models.ManyToManyField("B", related_name="aas", blank=True) field1 = models.TextField() field2 = models.TextField() class B(models.Model): field1 = models.TextField() field2 = models.TextField()
Для одного представления, когда я выбираю группу «А», мне также нужны идентификаторы их «Б». По умолчанию, когда Django запрашивает соответствующие B для каждого A по отдельности, слишком медленно, поэтому я использую select_related
.
Если я это сделаю A.objects.select_related('bees')
, Django выберет полные B
модели:
SELECT ("app_a_bees"."from_a_id") AS "_prefetch_related_val_from_a_id", "app_b"."id", "app_b"."field1", "app_b"."field2", FROM "app_b" INNER JOIN "app_a_bees" ON ("app_b"."id" = "app_a_bees"."to_b_id") WHERE "app_a_bees"."from_a_id" IN (... list of A ids ...)
Но мне нужны только их значения идентификаторов, поэтому мне нужно только выбрать таблицу app_a_bees
соединений, чтобы получить их, а не таблицу B
моделей.
Я пытался A.objects.select_related('bees__id')
(я тоже пытался 'bees_id'
), но Джанго это не нравится, отдельные поля не могут быть предварительно выбраны таким образом.
Я также пробовал A.objects.select_related(Prefetch("bees", queryset=B.objects.all().only("id"))
, но это все равно присоединяется к B
таблице, чтобы выбрать id
поле, которое уже есть у Django в таблице объединения.
Есть ли какой-либо способ предварительно выбрать только таблицу соединений для моих A
объектов?
Комментарии:
1. Не могли бы вы поделиться своими моделями?
2. @WillemVanOnsem Конечно. Это просто упрощенная тестовая модель, полученная из моего реального приложения.