在Django中自动递增模型字段的值

时间:2011-02-10 19:22:00

标签: django django-models django-orm

我想问一个问题,我怎样才能在django中增加模型字段。 假设我有一个名为

的模型
  

将我的书签(请求)分类:

  url=models.URLField()
  popularity=models.IntegerField()

然后使用Django模板 我有

  
    

bookmarks.html

         

{%list_tagg%}中的数据库

  
     

URL:{{database.url}}

     
    

热门:{{database.popularity}}

  
     

{%endfor%}

现在:如果有人点击了链接(即bookmarks.html页面中的URL字段),我希望人气应该增加1.我该怎么办?有什么帮助吗?

3 个答案:

答案 0 :(得分:5)

使用F字段,)

from django.db.models import F

b = Bookmark.objects.get(pk=id_retrieved)
b.popularity = F('popularity') + 1
b.save()

答案 1 :(得分:1)

您可能希望实现Ajax调用以连接到服务器并记录单击。例如,使用jQuery,您可以在每次单击时调用此JS函数:

function incrementPopCounter(pop_id) {
    $.ajax({type: 'POST',
            dataType: 'json',
            url: '/pop/increment',
            data: 'id=' + pop_id,
            success: function(data) {
               if(data.result == 'OK') {
                   // handle success
               } else {
                   // handle failure
               }
            }
           });
    return false;
}

处理这个问题的Django视图可能如下所示:

from django.utils import simplejson
...
def increment_pop(request):
    if request.is_ajax():
        if 'pop_id' in request.POST and request.POST['pop_id']:
            try:
                pop = Bookmark.objects.get(pk=request.POST['pop_id'])
            except Bookmark.DoesNotExist:
                return HttpResponse(simplejson.dumps({'result': 'No bookmark by that id found.'}),
                                    mimetype='application/json')
            pop.popularity = F('popularity') + 1
            pop.save()
            return HttpResponse(simplejson.dumps({'result': 'OK'}),
                                mimetype='application/json')
        else:
            return HttpResponse(simplejson.dumps({'result': 'Unable to identify the requested bookmark.'}),
                                mimetype='application/json')
    else:
        return HttpResponseBadRequest()

答案 2 :(得分:0)

Almad的回答可以简化为以下内容:

from django.db.models import F

Bookmark.objects.get(pk=id_retrieved).update(popularity=F('popularity') + 1)