升级手动提交事务()到Django>1.6

2024-05-13 20:42:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我继承了一些为django1.4编写的应用程序的代码。 我们需要更新代码库,以便与django1.7一起使用,并最终将1.8作为下一个长期支持版本。在

在一些地方,它使用旧样式@transaction.commit_manually和{}

一般来说,我对事务的了解还不够,但我正试图了解它们的用途,因此我可以删除它们(如果不需要),或者将它们升级到更新的set_autocommit(False)或等效版本。在

我了解到Django<;1.5中的事务管理并不理想,对于大多数用例来说过于复杂。在

数据库连接如下所示,没有特殊的事务管理。(使用Postgres 9.3)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'dbname',
        'USER': 'user',
        'PASSWORD': '',
        'HOST': 'localhost',
        'PORT': '',
    }
}

没有专门的事务中间件。在

我觉得下面的观点特别令人费解。(已编辑)

^{pr2}$

其中initialize_xml_model是一个接受平面xml文件(xml模型模板)并创建新XMLModel对象的函数。并且insert_user_info将存储在用户对象中的信息插入到xml模型中。在

我读代码的方式是

  1. 我们用commit_manually关闭autocommit
    • 我们要么为用户获取最新的XMLModel对象,要么
    • 初始化新的XMLModel对象
  2. transaction.commit()如果没有错误,则将其存储到数据库中。在
  3. 我们检查model是否是unicode实例,然后对其进行编码(我不确定这到底是做什么的)
  4. 我们开始新的交易
  5. 使用model实例化XMLManipulator对象
  6. 插入内容并清理xml
  7. 将xml实例以字符串形式重新分配给modeltostring是一个保留样式表声明的xml操纵器方法)在
  8. 删除xml对象
  9. 提交事务

5点以后。唯一处理db(在read中)的是insert_user_info方法。在

我真的不明白为什么这会发生在一个特殊的交易中。没有给数据库写信?在

此视图上没有其他方法,只有get。在

我可能漏掉了一些重要的东西,请随时提问或了解更多信息。在

这里的事务真的是必需的吗?如果是的话,如何重写它以适应新的transaction.set_autocommit?在

任何帮助或建议将不胜感激。在


Tags: 对象实例方法代码版本数据库modelxml
1条回答
网友
1楼 · 发布于 2024-05-13 20:42:28

一个很好的方法是使用事务处理.atomic. 在你的例子中,我会这样做:

from django.db import transaction

@UserRequiredDecorator
class XMLModelView(View):

    def get(self, request, *args, **kwargs):

        with transaction.atomic():
            user = request.user

            xml_models = models.XMLModel.objects.filter(user=user).order_by('-created').all()
            if xml_models:
                xml_model = xml_models[0]
                model = xml_model.xml_field
            else:
                obj = initialize_xml_model(user)
                model = obj.xml_field

        if isinstance(model, unicode):
            model = model.encode('utf-8')

        with transaction.atomic():
            xml = XMLManipulator(model, remove_blank_text=True)
            xml.insert_user_info(user)
            xml.whitespace_cleanup()
            model = xml.tostring()
            del xml

        return HttpResponse(model, content_type='text/xml')

相关问题 更多 >