Django prefetch_related на ManyToMany (через) - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь свести к минимуму количество запросов на ManyToMany(through=), но я, кажется, вызываю n + 1 просто путем предварительной выборки.

Модели:

class Member(ImmutableModel):
  organizations = models.ManyToManyField('Organizations', through='MemberOrg', related_name='members')

class MemberOrg(ImmutableModel):
  member = models.ForeignKey('Member', related_name='member_orgs')
  org = models.ForeignKey('Organization', related_name='member_orgs')

class Organization(ImmutableModel):

Изчистая база данных, если я настрою эти модели:

member = Member.objects.create()
org = Organization.objects.create()
MemberOrg.objects.create(member=member, org=org)
MemberOrg.objects.create(member=member, org=org)

Затем извлекаю:

Member.objects.all().prefetch_related('member_orgs')

Я получаю следующие запросы:

(0.009) SELECT "main_member"."id", (...) FROM "main_member"; args=()
(0.010) SELECT "main_memberorg"."id", (...) FROM "main_memberorg" WHERE "main_memberorg"."member_id" IN (1); args=(1,)
(0.005) SELECT "main_member"."id", (...) FROM "main_member" WHERE "main_member"."id" = 1; args=(1,)
(0.003) SELECT "main_member"."id", (...) FROM "main_member" WHERE "main_member"."id" = 1; args=(1,)

Iя пытаюсь выяснить, почему я получаю один запрос модели Member на MemberOrg. Это поведение продолжается, когда я добавляю MemberOrg -s. Я не могу найти упоминания об этом в документах , и эти вопросы предполагают, что именно так они решили проблему, но, похоже, это неработать так, как задумано для меня.

(Примечание: это всего лишь пример схемы - мои требования более сложны, и я привязан к этой настройке модели.)

Django: 1.9.1
postgres: 9,6

...