当 'atomic' 块处于活动状态时,这是禁止的。姜戈 1.8
This is forbidden when an 'atomic' block is active. Django 1.8
我在安装 Django 1.8 时收到错误 This is forbidden when an 'atomic' block is active.
。
我尝试用 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
可能是什么原因造成的?为什么我的异常处理无法阻止收到此错误?
这是回溯:
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.
根据回溯,您似乎正在覆盖模型的 save()
方法并显式调用 transaction.commit()
.
File "/vagrant/client/client/items/models.py", line 45, in save
transaction.commit()
如错误所示,您不能在原子块内执行此操作,因为该块期望自己执行此操作。
更根本的是,这里的错误在于混合了高级事务 API (transaction.atomic()
) 和低级事务 API (transaction.commit()
)。它们应该是彼此的替代品,而不是一起使用。
Always prefer atomic()
if possible at all. It accounts for the idiosyncrasies of each database and prevents invalid operations.
The low level APIs are only useful if you’re implementing your own transaction management.
我在安装 Django 1.8 时收到错误 This is forbidden when an 'atomic' block is active.
。
我尝试用 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
可能是什么原因造成的?为什么我的异常处理无法阻止收到此错误?
这是回溯:
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.
根据回溯,您似乎正在覆盖模型的 save()
方法并显式调用 transaction.commit()
.
File "/vagrant/client/client/items/models.py", line 45, in save
transaction.commit()
如错误所示,您不能在原子块内执行此操作,因为该块期望自己执行此操作。
更根本的是,这里的错误在于混合了高级事务 API (transaction.atomic()
) 和低级事务 API (transaction.commit()
)。它们应该是彼此的替代品,而不是一起使用。
Always prefer
atomic()
if possible at all. It accounts for the idiosyncrasies of each database and prevents invalid operations. The low level APIs are only useful if you’re implementing your own transaction management.