Я пытаюсь свести к минимуму количество запросов на 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