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)
根据回溯,您似乎正在覆盖模型的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 仅在您实现自己的事务管理时才有用。
| 归档时间: |
|
| 查看次数: |
5151 次 |
| 最近记录: |