我有一个看起来像
的模型class order(models.Model):
user = models.ForeignKey(some_user)
number = models.PositiveIntegerField()
数字应该是基于用户的现有订单总数的递增(+1)量。我之前已经研究过F()对象,但是从我可以收集的内容来看,它们只能用于更新预先存在的字段。有没有办法将数字增加1而不必担心两个订单具有相同的数字?
答案 0 :(得分:0)
我认为您要做的是获取每个用户的订单总数。然后,首先在user
和order
之间创建多对多字段会更好。然后,您可以通过简单地实例化给定用户(例如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进行原子计数,只是查询它以获得最新的订单值。