假设我有一些包含一些项目的组。我希望项目在组中具有唯一索引:
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_index 之后和我写入数据库之前添加了另一行。
我知道我可以通过捕获 IntegrityError 并重试来让它工作。但我想知道是否有一种好方法可以将它作为插入命令的一部分原子地填充,使用 SQL 类似:
insert into app_item (group, index)
select 25, count(*) from app_item where group_id=25