我在Django REST框架应用程序中遇到这种情况:
我有删除视图:
def delete(self, request, pk, lid=None, *args, **kwargs):
user_info = self.get_object(pk)
if user_info:
location = Location.objects.filter(loc_id=lid).first()
location.users.remove(user_info)
if location.users.count() is 0:
//delete location
return Response(status=status.HTTP_200_OK)
return Response(status=status.HTTP_404_NOT_FOUND)
我认为在此代码中有一个潜在的关键部分:
流量 - 1 :检查计数位置用户 - > count是0
flow - 2 :将新用户(user2)添加到位置用户(通过其他视图)
flow - 1 :删除位置,因为位置用户为0(但这不正确,因为flow-2添加了新的user_info)。
Django是否可以使用此部分(检查值和删除操作)
location = Location.objects.filter(loc_id=lid).first()
location.users.remove(user_info)
if location.users.count() is 0:
//delete location
原子
答案 0 :(得分:0)
只需使用交易并将数据库设为atomicity的位置:
Atomicity是数据库事务的定义属性。
atomic
允许我们创建一个代码块,在该代码块中保证数据库的原子性。如果代码块成功完成,则更改将提交到数据库。如果存在异常,则会回滚更改。
from django.db import transaction
def delete(self, request, pk, lid=None, *args, **kwargs):
with transaction.atomic():
user_info = self.get_object(pk)
if user_info:
location = Location.objects.filter(loc_id=lid).first()
location.users.remove(user_info)
if location.users.count() is 0:
# delete location
location.delete()
return Response(status=status.HTTP_200_OK)
return Response(status=status.HTTP_404_NOT_FOUND)