Предварительная выборка объекта с несколькими уровнями обратного поиска

Я на 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" к той модели, которую вы в конечном итоге хотите.

Другие вопросы по тегам