Django select_релировал таблицу соединений только для отношения «многие ко многим»

#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 Конечно. Это просто упрощенная тестовая модель, полученная из моего реального приложения.