I have a simple Task model:
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)
查看任务的现有转移会在新创建的任务后面+1,然后创建一个新任务。
许多用户使用此方法,我认为由于更新和创建一定要一起执行,某一天排序肯定会出问题。
所以,我只想确保,是否足以避免任何数据损坏:
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) 可能需要在任务创建行中使用类似于select_for_update
的操作,来保证存在于Task.objects
的filter
运行之前。
2) return HttpResponse()
的位置是否重要?它应该放在事务块内还是外面?
非常感谢!