【发布时间】:2015-08-27 15:45:07
【问题描述】:
我有模型,例如:
class Example(models.Model):
title = models.SlugField()
version = models.PositiveSmallIntegerField(default=0)
content = models.TextField(blank=True)
class Meta:
unique_together = (
('title', 'version'),
)
我想在下面实现类似的东西,但以某种方式避免竞争条件并使这个原子:
e = Example(title='test')
e.version = Example.objects.filter(title=e.title).aggregate(Max('version'))['version__max']+1
e.save()
附言。我正在使用 Django 1.8
【问题讨论】:
-
保存前不能过滤
-
如果此文档的版本最高,我会添加一个
BooleanField来存储 -
您的实例从哪里保存?既然你提到了原子事务,我认为你不能用
@transaction.atomic装饰那个函数是有原因的。为了确保理解它,您希望同时请求获得相同的version__max并因此一个save()导致由于唯一约束而导致完整性错误可能会导致竞争条件? -
我担心计算
version作为最大可能版本+ 1和调用save()方法之间的时间。我可以在with transaction.atomic():中换行第 2 行和第 3 行吗?
标签: python django django-models django-orm