Предварительная выборка объекта с несколькими уровнями обратного поиска
Я на Django 1.7 и использую новый Prefetch
объекты, которые являются отличным дополнением. Однако я, похоже, застрял, когда мне нужно пересмотреть более одного отношения. Вот мой код:
product_types = self.get_queryset().select_related().prefetch_related(
'excise_category__exciseitem_set__unit',
Prefetch(
'bevtank_set__package_set__checkout_set',
queryset=CheckOut.objects.filter(
create_date__lte=end_date,
submission__isnull=True,
exempt=False),
to_attr='checkouts_due'
)
)
...
for pt in product_types:
...
co = pt.checkouts_due
...
Это дает мне 'ProductType' object has no attribute 'checkouts_due'
на co = pt.checkouts_due
, Если я уменьшу поиск до одного обратного поиска (для целей отладки), он будет работать нормально.
Так что либо с моим кодом что-то не так, либо ограничение на Prefetch. Может кто-нибудь пролить свет на то, что может происходить здесь?
Спасибо Натан
1 ответ
Так как вы получаете три уровня данных предварительной выборки, свойство будет существовать на уровне, предшествующем последнему. Что это значит, что вам нужно сделать что-то подобное, чтобы получить к нему доступ:
bevtank_set__package_set__checkout_set
for pt in product_types:
for bevtank in pt.bevtank_set.all():
for package in bevtank.package_set.all():
co = package.checkouts_due
Django не будет объединять вашу предварительную выборку по нескольким отношениям в одно свойство в первоначально запрашиваемой модели. Вы должны перейти к свойству, которое имеет отношение "многие ко многим" или "обратное отношение FK" к той модели, которую вы в конечном итоге хотите.