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

查询应该是:

update table set hit_count = hit_count + 1 where id = 3

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

有帮助吗?

解决方案

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

from django.db.models import F
...
MyModel.objects.filter(id=...).update(hit_count=F('hit_count')+1)

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

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


其他提示

正如gerdemb所说,您应该将其写入中间件,以使其真正可重用。或者(更简单)编写一个函数装饰器。实际上,有些适配器可以将中间件用作装饰器而反之亦然。

但是如果您担心性能并且希望每页的数据库查询保持较低,则可以使用memcached的原子增量操作。当然,在这种情况下,你必须自己照顾持久性。

模型约定不是原子的;手写:

BEGIN
SELECT * FROM table WHERE id=3 FOR UPDATE
UPDATE table SET hit_count=hit_count+1 WHERE id=3
COMMIT

我首先看一下中间件。 Ignacio关于缺乏原子事务的评论是正确的,但这是整个Django框架的一个问题。除非你担心100%准确的计数器,否则我不担心。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top