Mike
Mike

Reputation: 23

I am trying to maths on a django object and failing

My model

class Credits(models.Model):
creds = models.IntegerField(default=0)
user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)

My view

def addjobdata(request):
n = JobInfo.objects.create(title=request.POST['title'], start_date=timezone.now(), end_date=timezone.now() + datetime.timedelta(days=int(request.POST['days'])), rate=request.POST['rate'] )
if int(Credits.objects.get(user_id=request.user).creds) > int(request.POST['days']):
    Credits.objects.get(user_id=request.user).creds -= int(request.POST['days'])
    Credits.objects.get(user_id=request.user).creds.save()
    return HttpResponseRedirect(reverse('datedisplay:infos', args=(n.id,)))
else:
    return render(request, 'datedisplay/menu.html')

In the if loop I am trying to take a number from an integer field and save the result but am failing to do so. Any ideas where I've messed up?

Upvotes: 0

Views: 30

Answers (1)

Daniel Roseman
Daniel Roseman

Reputation: 599530

You're repeatedly querying the same object. Quite apart from the unnecessary load on the database, each time you query you get a new object, which doesn't contain the changes you made.

Instead query it once and save to a variable:

cred = Credits.objects.get(user=request.user)
days = int(request.POST['days'])
if cred.creds > days:
    cred.creds -= days
    cred.save()
    return HttpResponseRedirect(reverse('datedisplay:infos', args=(n.id,)))

Also note, you need to save the Credits instance itself, not the creds attribute.

Upvotes: 1

Related Questions