这是设置
class A(Model):
pass
class B(Model):
a = ForeignKey(A, on_delete=CASCADE)
assert A.objects.all().count() == 0
try:
B.object.create(a_id=1)
except IntegrityError:
print('error')
# ... another logic to deal with situation
db是postgresql。尚无A
对象(至少使用id=1
(。
我尝试使用从第三方获取的一些假设对象A
的ID创建对象B
。
期望
如果没有对象A
-> firtegityError被抛弃 ->处理它(例如,使用id=1
和Rerun创建对象A
(。
现实
尽管具有外键约束,但仍会创建对象B
,firtegtityError(Key (a_id)=(1) is not present in table "app_a"
(被抛弃,但没有通过try/除外。一切都混乱了。
i不是事先使用get_or_create
对象A
的方法,因为每次我要创建B
时我最终都会得到2个查询(并且我需要多次创建它,而大多数需要的时间需要的对象A
已经在DB中(
编辑1
事实证明,问题是在pytest上。只有内部测试我无法捕获IntegrityError
。
with pytest.raises(IntegrityError):
b = B.objects.create(a_id=1)
尽管没有id=1
的A
对象,但上面的代码并未提高IntegrityError
。尽管如此,IntegrityError
的追溯仍在控制台中打印出来。并创建对象b
。
问题是尝试在原子事务中捕获IntegrityError
。
pytest
的家伙帮助修复了@pytest.mark.django_db(transaction=True)
,而不仅仅是@pytest.mark.django_db
。