Извлечь текущие данные из поля 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

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