首页 > 解决方案 > 在 Django rest api 中缓慢的互联网连接时更新数据

问题描述

视图.py

  class Bet(UpdateAPIView):
      """
      Sample method
      """
      def put(self, request, *args, **kwargs):
         with transaction.atomic():

            instance = self.get_object()

            if request.data.get('i') == 1:
                #some code 
            elif request.data.get('i') == 2:
                #some code 
            elif request.data.get('i') == 3:
                #some code 
            elif request.data.get('i') == 4:
                #some code 
            else:
               ## a large block of code also **it create a new entry for request user and bet in 3-4 tables.**


               instance.user = request.user
               instance.save()
           return custom_render(status_code, message, response_status)

这里有两个用户(user1 和 user2)在缓慢的互联网连接中同时调用 API。

现在由于连接速度慢,两个 API 都通过了所有验证和代码执行到达else 块。并将为两个用户创建条目。

这里我的问题是,如果任何用户接受投注,那么没有人可以接受相同的投注。

在快速的互联网连接中,通过检查 request.data.get('i') == 1 True 并返回响应可以正常工作。

标签: pythondjangopython-3.xdjango-rest-framework

解决方案


这个理论未经测试,但我怀疑你可以.select_for_update()在你的视图的查询集属性上抛出一个。

.get_object()调用.get_queryset(),并且由于您的代码在原子块中执行,因此应锁定该行,直到事务完成。

class Bet(UpdateView):
    queryset = Bet.objects.all().select_for_update()

    def put(self, request, *args, **kwargs):
        with transaction.atomic():
            instance = self.get_object()
            ...

推荐阅读