Update_create создает новые фейлы вместо обновления общего количества

payments = list((expense
                     .annotate(month=Month('startDate'))
                     .values('month')
                     .annotate(total=Sum('cost'))
                     .order_by('month')))
    
    for i in payments:
        paymentMonths = (i["month"])
        paymentTotal= (i["total"])
        
        obj, created = Payment.objects.update_or_create(
            author=curruser,
            date=paymentMonths,
            total = paymentTotal,
            defaults={"total": paymentTotal},
            )
    totalcost = Payment.objects.filter(author = curruser.id)

enter image description here

Очевидно, он должен обновить (date = 12) total, но он создает новые с обновленным значением, это может быть потому, что totaldate отличается или, возможно, я ошибаюсь, это сбивает с толку

Я считаю, что вам просто нужно опустить total = paymentTotal из ваших аргументов.

obj, created = Payment.objects.update_or_create(
    author=curruser,
    date=paymentMonths,
    defaults={"total": paymentTotal},
    )

Это происходит потому, что он запрашивает БД, чтобы узнать, существует ли уже платеж с такой суммой, и если нет, то создается новый. Вместо этого вы хотите запрашивать Платежи с curruser в качестве author и с date в качестве paymentMonths, обновляя total с новым paymentTotal

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