Невозможно объединить десятичное поле в 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']