Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django编辑模型&x27;s字段并发_Python_Django_Database - Fatal编程技术网

Python Django编辑模型&x27;s字段并发

Python Django编辑模型&x27;s字段并发,python,django,database,Python,Django,Database,我稍微简化了我的代码,但基本上我正在做的是,我有两个不同的URI,它们都在同一个模型上执行一些更改(虽然不是同一个字段)。 这里的问题是,我的客户基本上同时给他们打电话 # /uri/one/{pk}/ class ModelOneView(generic.View): def post(self, request, pk): # pk has the same value as below Model.objects.filter(pk=pk).update(nam

我稍微简化了我的代码,但基本上我正在做的是,我有两个不同的URI,它们都在同一个模型上执行一些更改(虽然不是同一个字段)。 这里的问题是,我的客户基本上同时给他们打电话

# /uri/one/{pk}/  
class ModelOneView(generic.View):
    def post(self, request, pk): # pk has the same value as below
        Model.objects.filter(pk=pk).update(name=request.POST['name'])
        return HttpResponse(status=200)

# /uri/two/{pk}/
class ModelTwoView(generic.View):
    def post(self, request, pk): # pk has the same value as above
        Model.objects.filter(pk=pk).update(bool_field=True)
        return HttpResponse(status=200)
Django和Client在任何时候都不会抛出任何错误,我会收到OK响应。但是,我试图对callFirstURI()进行的更改;永远不要访问数据库。但是当我注释掉callSecondURI()时

现在,对第一个URI的调用按预期工作

我怎样才能解决这个问题?我正在使用psql、Python 2.7和Django 1.9。 如何修改模型的字段而不存在此类冲突的风险

编辑


我想为这个问题找到一个服务器端的解决方案,而不是只对客户端的javascript请求进行更有利的计时。

您可能希望尝试两个建议:

  • 在AJAX请求中使用回调完成
    callFirstURI()
    后运行
    callSecondURI()

  • 它可能不适用(我绝对不是这方面的专家),但这听起来可能与多线程有关。有一个处理这个装饰看看

  • 你考虑过吗

    返回一个查询集,该查询集将锁定行,直到 事务,正在生成选择。。。用于更新上的SQL语句 支持的数据库

    支持的数据库有Postgresql、Oracle和Mysql。我注意到你没有提到你的数据库。虽然sqlite不受支持,但至少在linux上,这很少是一个问题,因为文件锁定将确保使用sqlite不会重写相同的数据

    您需要将其用于原子事务以获得最佳结果

    function notHealthyForDjango() {
        callFirstURI();
        //callSecondURI();
    }
    

    嘿,雅各布!谢谢你的回复。按照你在第一封推荐信中写的那样做效果很好。但是,如果可能的话,我想找到一个服务器端解决方案来解决这个问题。我的错是没有弄清楚。稍后我会查看你的第二个推荐!嗨,很高兴我帮了忙。如果解决方案有效,那么请考虑接受答案,尽管我理解我没有给出服务器端的方法。你是否尝试过我的建议?对不起,我还没有时间。我将在本周晚些时候回到这里,看看这是否解决了问题。这看起来很有希望,我真的非常感谢你的帮助!很抱歉耽搁了。很高兴知道它起作用了。今天无法对您的问题进行投票(投票数不足,将于明天进行投票)
    function notHealthyForDjango() {
        callFirstURI();
        //callSecondURI();
    }
    
    def post(self, request, pk): # pk has the same value as below
        with transaction.atomic():
            Model.objects.select_for_update().filter(pk=pk).update(
                           name=request.POST['name'])
            return HttpResponse(status=200)