Не работает предварительная выборка вложенных 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)