Заполненные значения модели не обновляются в django

Создавая эту платформу для голосования, пользователи должны будут покупать голоса. Они будут вводить количество голосов, которые они хотят купить, затем производить оплату. После успешной оплаты, количество голосов, которые они только что купили, должно быть добавлено к их старым голосам в базе данных

Например, если пользователь покупает 2 голоса, а у него уже есть 3 голоса, 2 следует добавить к 3, чтобы получилось 5.

Моя проблема в том, что новые голоса не добавляются.

models.py

class Nomination(models.Model):
    Fullname = models.CharField(max_length=120)
    Nominee_ID = models.CharField(max_length=100)
    Category = models.ForeignKey(Category, on_delete=models.CASCADE)
    image = models.ImageField(upload_to='nominations_images')
    slug = models.SlugField(max_length=150)
    votes = models.IntegerField(default=0)
    date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.Fullname
 
views.py

def process_payment(request, slug, amount):
    trans_id = request.GET.get('transaction_id')
    status = request.GET.get('status')
    reason = request.GET.get('reason')
    transaction_id = request.GET.get('transaction_id')
    if status == 'approved':
        transaction = SuccessfulTransactionHistory(
            nominee_name=slug,
            transaction_id=transaction_id,
            amount=amount
        )
        transaction.save()
        nomination = Nomination.objects.filter(slug=slug).values('votes')
        Nomination.objects.filter(slug=slug).update(votes=int(nomination[0]['votes']) + int(amount[:-2]))
        return redirect('/success')
    else:
        context = {
            'error': reason
        }
        transaction = FailedTransactionHistory(
            nominee_name=slug,
            transaction_id=transaction_id,
            amount=amount
        )
        transaction.save()
        return render(request, 'payment_error.html', context=context)


Нет необходимости выполнять отдельные запросы для получения значения (первый) и инкремента (второй). Просто используйте выражение F для доступа к полю из той же модели и выполнения инкремента за одну операцию:

from django.db.models import F

Nomination.objects.filter(slug=slug).update(votes=F('votes') + amount)

Нет необходимости приводить Nomination.votes к int, поскольку это уже так. Но если amount является str (хотя лучше, если вы примете его в URL как int, чтобы избежать преобразований, подобных этому):

Nomination.objects.filter(slug=slug).update(votes=F('votes') + int(amount[:-2]))  # The slice [:-2] was used as performed in the question. Adjust accordingly depending on what the amount really contains.

Здесь все Nomination объекты с целью slug будут иметь votes увеличенные на указанную сумму.

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