gpt4 book ai didi

Django:原子事务中的对象创建

转载 作者:行者123 更新时间:2023-12-04 14:23:02 24 4
gpt4 key购买 nike

我有一个简单的 任务 模型:

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之前 filter现有 Task.objects ?

2) 哪里有关系 return HttpResponse()位于?内部事务块还是外部?

大谢谢

最佳答案

1) Probably, something more should be done in task creation line like select_for_update before filter of existing Task.objects?



不 - 您目前拥有的看起来不错,应该按照您希望的方式工作。

2) Does it matter where return HttpResponse() is located? Inside transaction block or outside?



是的,这很重要。无论您的交易是否成功,您都需要向客户端返回响应 - 所以它肯定需要在交易块之外。如果您在事务内部执行此操作,则如果事务失败,客户端将收到 500 服务器错误。

但是,如果事务失败,那么您将没有新的任务 ID,也无法在响应中返回该 ID。因此,您可能需要根据事务是否成功返回不同的响应,例如:
from django.db import IntegrityError, transaction

try:
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)
except IntegrityError:
# Transaction failed - return a response notifying the client
return HttpResponse('Failed to create task, please try again!')

# If it succeeded, then return a normal response
return HttpResponse(new_task.id)

关于Django:原子事务中的对象创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49713584/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com