Django潜在的关键部分

时间:2017-01-22 10:12:21

标签: python django orm transactions critical-section

我在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

原子

1 个答案:

答案 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)