当"原子"块处于活动状态时,这是禁止的.Django 1.8

Cec*_*uez 5 python django transactions

This is forbidden when an 'atomic' block is active.在Django 1.8安装上收到错误.

我已经尝试将它包装在两者transaction.atomic():中以及创建例外IntegrityError

这是我的代码:

item = Item.objects.filter(item_id = data['item_id'])[:1][0]
iserializer = ItemSerializer(item, data=data, partial=True)
try:
    with transaction.atomic():
        if iserializer and iserializer.is_valid():
            iserializer.save()
except IntegrityError:
    pass
Run Code Online (Sandbox Code Playgroud)

可能是什么原因造成的?为什么我的异常处理无法防止收到此错误?

这是追溯:

Traceback (most recent call last):
  File "<console>", line 4, in <module>
  File "/home/vagrant/client/venv/bin/local/lib/python2.7/site-packages/rest_framework/serializers.py", line 186, in save
    self.instance = self.update(self.instance, validated_data)
  File "/home/vagrant/client/venv/bin/local/lib/python2.7/site-packages/rest_framework/serializers.py", line 880, in update
    instance.save()
  File "/vagrant/client/client/items/models.py", line 45, in save
    transaction.commit()
  File "/home/vagrant/client/venv/bin/local/lib/python2.7/site-packages/django/db/transaction.py", line 42, in commit
    get_connection(using).commit()
  File "/home/vagrant/client/venv/bin/local/lib/python2.7/site-packages/django/db/backends/base/base.py", line 172, in commit
    self.validate_no_atomic_block()
  File "/home/vagrant/client/venv/bin/local/lib/python2.7/site-packages/django/db/backends/base/base.py", line 322, in validate_no_atomic_block
    "This is forbidden when an 'atomic' block is active.")
TransactionManagementError: This is forbidden when an 'atomic' block is active.
Run Code Online (Sandbox Code Playgroud)

Kev*_*nry 5

根据回溯,您似乎正在覆盖模型的save()方法并显式调用transaction.commit().

File "/vagrant/client/client/items/models.py", line 45, in save
  transaction.commit()
Run Code Online (Sandbox Code Playgroud)

正如错误所示,您不能在原子块内执行此操作,因为该块希望自己执行此操作。

更根本的是,这里的错误在于混合了高级事务 API ( transaction.atomic()) 和低级事务 API ( transaction.commit())。它们旨在相互替代,而不是一起使用。

文档

atomic()如果可能的话,总是更喜欢。它考虑了每个数据库的特性并防止无效操作。低级 API 仅在您实现自己的事务管理时才有用。