【发布时间】:2018-04-08 01:35:44
【问题描述】:
我有一个简单的任务模型:
class Task(models.Model):
name = models.CharField(max_length=255)
order = models.IntegerField(db_index=True)
还有一个简单的task_create视图:
def task_create(request):
name = request.POST.get('name')
order = request.POST.get('order')
Task.objects.filter(order__gte=order).update(order=F('order') + 1)
new_task = Task.objects.create(name=name, order=order)
return HttpResponse(new_task.id)
View 将现有的任务转移到 +1 新创建的之后,然后创建一个新的。
而且这种方法有很多用户,我想有一天订购会出错,因为update和create绝对应该一起执行。 p>
所以,我只想说清楚,是否足以避免任何数据损坏:
from django.db import transaction
def task_create(request):
name = request.POST.get('name')
order = request.POST.get('order')
with transaction.atomic():
Task.objects.select_for_update().filter(order__gte=order).update(order=F('order') + 1)
new_task = Task.objects.create(name=name, order=order)
return HttpResponse(new_task.id)
1) 可能,在现有的Task.objects 的filter 之前的select_for_update 之类的任务创建行中应该做更多的事情?
2) return HttpResponse() 的位置重要吗?交易块内部还是外部?
谢谢
【问题讨论】:
标签: django transactions atomic