Не работает предварительная выборка вложенных FK в Django

Я немного поработал над этим, но не могу добиться правильной работы предварительной выборки в моем экземпляре. Я пытаюсь запустить вложенный Prefetch() для предварительной выборки элементов из предварительно выбранного объекта, но атрибут не сохраняется, как обычно. Кто-нибудь может показать мне, что я делаю неправильно?

Вот мой код:

primary_residents = Resident.objects.filter(
        property=request.session['property'], type='primary', user__is_active=True
    ).select_related(
        'unit', 'unit__building', 'user'
    ).prefetch_related(
        Prefetch('current_balance',
                 queryset=Balance.objects.filter(is_active=True).prefetch_related(
                     Prefetch('charges',
                              queryset=Charges.objects.filter(date_entered__range=(
                                      previous_month, property.close_out_start_date_plus_one()), reversed=False
                              ).prefetch_related(
                                  'code', 'balance'),
                              to_attr='previous_charges'
                              )
                 ), to_attr='active_balance'
                 ),
    )
for p in primary_residents:
    # errors out, previous_charges is not a valid attr
    print(p.active_balance.previous_charges)

Я нашел решение.

primary_residents = Resident.objects.filter(
        property=request.session['property'], type='primary', user__is_active=True
    ).select_related(
        'unit', 'unit__building', 'user'
    ).prefetch_related(
        Prefetch('current_balance',
                 queryset=Balance.objects.all().prefetch_related(
                     Prefetch('charges',
                              queryset=Charges.objects.filter(date_entered__range=(previous_month, property.close_out_start_date_plus_one()), has_been_reversed=False
                                                              ).prefetch_related('code', 'balance', 'charges_history'),
                              to_attr='previous_charges'
                              ),
                     Prefetch('payments',
                              queryset=Payments.objects.filter(date_entered__range=(previous_month, property.close_out_start_date_plus_one()), has_been_returned=False
                                                               ).prefetch_related('code', 'balance'),
                              to_attr='previous_payments'
                              ),
                     Prefetch('charges',
                              queryset=Charges.objects.filter(date_entered__range=(previous_month, property.close_out_start_date_plus_one()), has_been_reversed=False
                                                              ).prefetch_related('code', 'balance'),
                              to_attr='current_charges'
                              ),
                     Prefetch('payments',
                              queryset=Payments.objects.filter(date_entered__range=(previous_month, property.close_out_start_date_plus_one()), has_been_returned=False
                                                               ).prefetch_related('code', 'balance'),
                              to_attr='current_payments'
                              ),
                 )
                 )
    )
    for p in primary_residents:
            print(p.current_balance.previous_charges)


Вернуться на верх