在Django增加页面命中数

16 python django django-models

我有一个带IntegerField(hit_count)的表,当访问一个页面时(例如http://site/page/3),我希望hit_count数据库中的记录ID 3的列增加1.

查询应该像:

update table set hit_count = hit_count + 1 where id = 3
Run Code Online (Sandbox Code Playgroud)

我可以使用标准的Django模型约定吗?或者我应该手动编写查询?

Car*_*yer 31

如果你使用Django 1.1+,只需使用F表达式:

from django.db.models import F
...
MyModel.objects.filter(id=...).update(hit_count=F('hit_count')+1)
Run Code Online (Sandbox Code Playgroud)

这将执行单个原子数据库查询.

正如gerdemb所说,你应该考虑把它放在一个中间件中,以便它可以轻松重复使用,这样就不会让你的所有观点变得混乱.


  • @Jared因为.get()不是懒惰的(它实际上是在查询数据库).这就是为什么单个模型对象没有.update()方法的原因; 一旦你已经查询过,你只需使用.save().但是你失去了原子性,这就是这里的重点.原子更新的.update()方法仅在QuerySets上可用,并且只能因为它们是惰性的. (6认同)
  • 我认为你想要的是“MyModel.objects.get(id=...)”而不是“filter”;如果我们知道它是单行,为什么不说清楚呢? (2认同)