Django 模型未更新

mk8*_*efz 1 python django

我正在尝试计算用户访问页面的次数:

模型.py:

class Request(models.Model):
    user = models.ForeignKey(User)
    view = models.CharField(max_length = 250)
    visits = models.PositiveIntegerField()
Run Code Online (Sandbox Code Playgroud)

视图.py

def daygaps(request,*a, **kw):

    request_counter = Request.objects.filter(
        user__username = request.user.username, view = 'daygaps')

    if request_counter:
        request_counter[0].visits += 1
        request_counter.update()

    else:
        Request.objects.create(
            user = request.user,
            visits = 1,
            view = 'daygaps')
Run Code Online (Sandbox Code Playgroud)

当新用户第一次访问该页面时,“访问”设置为 = 1。随后的每次访问都应迭代计数。“else”块工作正常,但“visits”保持为 1,并且不会随着用户发出的每个新请求而改变。

我尝试过“.save()”方法,但是会引发错误,因为“request_counter”是一个查询集。

Iva*_*van 5

你可以这样做:

模型.py

class Request(models.Model):
    user = models.ForeignKey(User)
    view = models.CharField(max_length = 250)
    visits = models.PositiveIntegerField(default=0)
Run Code Online (Sandbox Code Playgroud)

视图.py

def daygaps(request,*a, **kw):

    request_counter = Request.objects.get_or_create(
        user = request.user, view = 'daygaps')

    request_counter.visits += 1 # or =F('visits')+1 to avoid a race condition as suggested by Moses Koledoye
    request_counter.save()
Run Code Online (Sandbox Code Playgroud)

或者

模型.py

class Request(models.Model):
    user = models.ForeignKey(User)
    view = models.CharField(max_length = 250)
    visits = models.PositiveIntegerField(default=1)
Run Code Online (Sandbox Code Playgroud)

视图.py

def daygaps(request,*a, **kw):

    updated_count = Request.objects\
        .filter(user = request.user, view = 'daygaps')\
        .update(visits=F('visits')+1)

    if not updated_count:
        Request.objects.create(user = request.user, view = 'daygaps')
Run Code Online (Sandbox Code Playgroud)

这也避免了竞争条件,并且具有不必检索对象的额外优点。

一般来说,如果更新足够简单,可以用F表达式来实现,我认为第二个更好。