Невозможно изменить istance в наборе запросов/выпадающем списке без ошибок
В настоящее время я разрабатываю приложение для управления квартирами. Одним из требований является возможность обработки платежей от арендаторов путем использования его комнаты/залогового депозита. Для этого случая будут задействованы следующие модели (минимальная установка):
'''
class Billing(models.Model):
bill_batch = models.ForeignKey(BillBatch, on_delete=models.PROTECT)
reservation = models.ForeignKey(
'tenants.Reservation', on_delete=models.PROTECT)
rental = models.DecimalField(max_digits=9, decimal_places=2, default=0)
electricity = models.DecimalField(max_digits=9, decimal_places=2, default=0)
water = models.DecimalField(max_digits=9, decimal_places=2, default=0)
class SecurityDeposit(models.Model):
payments = models.ForeignKey(Payment, on_delete=models.PROTECT)
reservations = models.ForeignKey(
'tenants.Reservation', on_delete=models.PROTECT)
deposit_date = models.DateField(default=date.today,
verbose_name='Date deposited')
deposited_amount = models.DecimalField(max_digits=9, decimal_places=2,
default=0, verbose_name='Amount deposited')
class ConsumeDeposit(models.Model):
billings = models.ForeignKey(
'billings.Billing', on_delete=models.PROTECT)
security_deposits = models.ForeignKey(
SecurityDeposit, on_delete=models.PROTECT)
pay_date = models.DateField()
allocated_amount = models.DecimalField(
max_digits=9, decimal_places=2, default=0)
'''
В моем коде,
'''
class ConsumeDepositEditMixin(object):
def dispatch(self, request, *args, **kwargs):
self.security_deposit = get_object_or_404(
SecurityDeposit, id=self.kwargs['deposit_id'])
# the qs must contain only billings exclusive to the reservation
# by which the deposit is allocated for; that is, deposit can't be consumed
# by other room reservations of the same tenant
self.billing_qs = Billing.objects.filter(
reservation=self.security_deposit.reservations)
# TODO: need fix, can't change billing item
return super().dispatch(request, *args, **kwargs)
def get_form(self, form_class=None):
form = super().get_form(form_class=None)
form.fields['security_deposits'].widget = forms.HiddenInput()
form.fields['billings'].queryset = self.billing_qs
return form
'''
В тестах, которые я сделал, у меня есть 2 доступных биллинга, скажем Billing-July и Billing-August для резервации, скажем Reservation-1. Проблема в том, что когда я пытаюсь изменить экземпляр биллинга, процесс сохранения завершается без ошибок, но когда я снова открываю форму ConsumeDeposit, изменение не сохраняется. Я попытался удалить фильтр в self.billings_qs, и все заработало нормально.
Я также попытался изменить набор запросов на следующий,
'''
reservations = Reservation.objects.filter(id=self.security_deposit.reservations_id)
self.billing_qs = Billing.objects.filter(
reservation_id__in=Subquery(reservations.values('id')))
'''
Но результат тот же. Какие поправки я должен внести, чтобы это заработало?