Невозможно объединить десятичное поле в Django

У меня есть набор запросов, в котором я хочу объединить поля amount, которое само является DecimalField. Целевое поле также является DecimalField.

Я получаю эту ошибку:

django.core.exceptions.ValidationError: [""{'amount__sum': Decimal('3821.02000000000')}" значение должно быть десятичным числом."]

.

Почему он говорит, что это должно быть десятичное число, хотя это DecimalField?

# models.py

class Payment(models.Model):

    offer = models.ForeignKey(Offer, on_delete=models.CASCADE)
    month = models.ForeignKey(Period, on_delete=models.CASCADE)
    payroll_run = models.ForeignKey(Payroll, on_delete=models.CASCADE, null=True, blank=True)  # is populated once the payroll run was created

    amount = models.DecimalField(decimal_places=2, max_digits=10)


class Payroll(models.Model):

    company = models.ForeignKey(Company, on_delete=models.CASCADE)
    month = models.DateField()
    amount = models.DecimalField(decimal_places=2, max_digits=10)
    line_items = models.PositiveIntegerField()
def test():
   ...

    # Loop the companies
    for company in qs_companies:
        # Query all Payments of that company in that month
        qs_payments = Payment.objects.filter(offer__company=company).filter(month=period)

        # Create a payroll run instance
        payroll_run = Payroll.objects.create(
            company=company,
            month=next_payroll_run,
            amount=qs_payments.aggregate(Sum('amount')),
            line_items=qs_payments.count()
        )

        payroll_run.save()
   ...

aggregate() возвращает словарь, вам нужно передать агрегированное значение, а не весь dict

        payroll_run = Payroll.objects.create(
            company=company,
            month=next_payroll_run,
            amount=qs_payments.aggregate(Sum('amount'))['amount__sum'], # <- added the lookup
            line_items=qs_payments.count()
        )

EDIT: Начиная с Django 4.0 вы можете добавить аргумент default к Sum

amount=qs_payments.aggregate(Sum('amount', default=Decimal(0)))['amount__sum']
Вернуться на верх