基于过滤结果的Django原子更新

时间:2011-06-23 01:21:29

标签: django django-models

我有一个看起来像

的模型
class order(models.Model):
    user = models.ForeignKey(some_user)
    number = models.PositiveIntegerField()

数字应该是基于用户的现有订单总数的递增(+1)量。我之前已经研究过F()对象,但是从我可以收集的内容来看,它们只能用于更新预先存在的字段。有没有办法将数字增加1而不必担心两个订单具有相同的数字?

4 个答案:

答案 0 :(得分:0)

我认为您要做的是获取每个用户的订单总数。然后,首先在userorder之间创建多对多字段会更好。然后,您可以通过简单地实例化给定用户(例如userone)然后调用

来获取所需的计数
userone.order_set.count()

答案 1 :(得分:0)

您正在寻找的是如何为每个用户创建序列。您可以使用数据库序列(postgres)或类似的东西:

class UserMetadata(models.Model):
    user = models.OneToOneField(User)
    next_order_number = models.PositiveIntegerField(default=1)

每次创建新订单时,都会使用next_order_number字段并将其递增1(在MySQL中使用UPDATE ... LAST_INSERT_ID(next_order_number+1)...。请参阅:AutoIncrement fields on databases without autoincrement field)。

据我所知,Django没有内置支持以原子方式创建此类序列。这可能是一个好的开始:http://djangosnippets.org/snippets/304/

答案 2 :(得分:0)

如果它仅仅是数字的增量,那么使用AutoField可能就足够了,但是在模型定义上不容易处理某些其他数据之前的值的增量。

一种可能的方法是覆盖 save()方法。

Check here用于基本的django保存程序。并here for如何覆盖默认保存方法。您可以尝试检查相关的保存操作是针对新插入还是更新现有记录,如果是插入,则可以为指定用户的该记录设置唯一编号。

答案 3 :(得分:0)

看到Django不支持创建原子序列,我的结论是使用Redis进行原子计数,只是查询它以获得最新的订单值。