Извлечь текущие данные из поля ManyToManyField для дальнейшего вычисления
models.py
class Invoice(models.Model):
id = models.BigAutoField(primary_key=True)
service = models.ForeignKey('Service', on_delete=models.PROTECT)
payment_month = models.CharField(max_length=10)
accrued = models.DecimalField(max_digits=11, decimal_places=4)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return "%s | %s" % (self.accrued, self.service)
class Meta:
verbose_name = 'Коммунальный счёт'
verbose_name_plural = 'Коммунальные счета'
class Check(models.Model):
id = models.BigAutoField(primary_key=True)
date_check = models.DateField()
group = models.ForeignKey('auth.Group', on_delete=models.PROTECT)
invoices = models.ManyToManyField('Invoice', related_name='checks')
total = models.DecimalField(max_digits=11, decimal_places=4, blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return str(self.date_check)
class Meta:
verbose_name = 'Счёт для оплаты'
verbose_name_plural = 'Счета для оплаты'
views.py
class AddChecks(CreateView):
model = Check
form_class = AddCheckForm
template_name = 'finance/add_check.html'
context_object_name = 'check'
success_url = reverse_lazy('check')
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['title'] = 'Создание счета за коммунальные услуги'
return context
forms.py
class AddCheckForm(forms.ModelForm):
current_datetime = date.today()
invoices = ModelMultipleChoiceField(queryset=Invoice.objects.filter(created_at__year=current_datetime.year,
created_at__month=current_datetime.month))
class Meta:
model = Check
fields = ['date_check', 'group', 'invoices', 'total']
widgets = {
'date_check': forms.DateInput(attrs={'class': 'form-control'}),
'group': forms.Select(attrs={'class': 'form-control'}), # На кого создаём счёт
'invoices': forms.SelectMultiple(attrs={'input class': 'form-control'}),
# Какие платежки входят в счёт
'total': forms.NumberInput(attrs={'class': 'form-control'}), # Общая сумма счёта
}
Здравствуйте. Нуждаюсь в помощи.
При создании счёта, у меня есть поле с множественным выбором, где я могу выбирать необходимые позиции. Вот это поле
invoices = models.ManyToManyField('Invoice', related_name='checks')
Перед сохранением в БД, мне нужно посчитать сумму значений из таблицы Invoice(models.Model)
поля accrued = models.DecimalField(max_digits=11, decimal_places=4), которые я выбрал. И это значение записать в total = models.DecimalField(max_digits=11, decimal_places=4, blank=True, null=True) таблицы Check(models.Model)
Хочу воспользоваться сигналом:
@receiver(pre_save, sender=Check)
def sum_all_invoices_pre_save(sender, instance, **kwargs):
Не могу получить список выбранных позиций текущей записи, чтобы потом в цикле посчитать сумму и записать значение в поле total