Django 如何将模型字段设置为当前计数?

Django 如何将模型字段设置为当前计数?,django,django-models,Django,Django Models,假设我有一些小组和一些项目。我希望项目在组中具有唯一索引: class Item(models.Model): group = models.ForeignKey(Group, null=True) index = models.IntegerField(default=0) class Meta: unique_together=('group','index') def save(self): if self.pk is N

假设我有一些小组和一些项目。我希望项目在组中具有唯一索引:

class Item(models.Model):
    group = models.ForeignKey(Group, null=True)
    index = models.IntegerField(default=0)

    class Meta:
        unique_together=('group','index')

    def save(self):
        if self.pk is None and self.group_id is not None:
            self.thread_index = Item.objects.filter(group_id=group_id).count()+1
        return super(Item, self).save()
但这是有问题的,因为更新不是原子的,也就是说,在我计算thread_索引之后,在我写入数据库之前,另一个事务可能已经添加了另一行

我知道我可以通过捕捉积分错误并重试来实现它。但我想知道是否有一种很好的方法可以将其作为insert命令的一部分进行原子填充,并使用类似以下内容的SQL:

insert into app_item (group, index) 
select 25, count(*) from app_item where group_id=25

由于您使用的是django模型,除非您另有指定,否则添加索引字段会给您带来什么?除非您需要项具有顺序索引,否则在删除对象时仍然会有问题,否则id字段肯定会满足您概述的要求


如果您必须拥有此字段,那么可以选择利用。为对象的post_save信号编写一个接收器,它可以处理它。

一个可能的解决方案是,如果信号或自定义保存方法有问题,在运行时通过创建
索引来计算它


现在使用
索引
作为
项目
模型的字段。

索引是每组的,而不是全局的。后期保存太迟了。我考虑过pre_save,但我相信它是来自我试图解决的同一个问题的冲浪者为什么全球索引不适合你?如果真的需要特定于组的索引,那么听起来每个组有一个序列的用例。如果需要组内的唯一性并允许在组之间删除或移动对象,则插入COUNT()将不起作用。
class Item(models.Model):
  group = models.ForeignKey(Group, null=True)

def _get_index(self):
  "Returns the index of groups"
   return Item.objects.filter(group_id=group_id).count()+1
index = property(_get_index)