如果相关外键不存在,如何禁止创建对象?



这是设置

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=1A对象,但上面的代码并未提高IntegrityError。尽管如此,IntegrityError的追溯仍在控制台中打印出来。并创建对象b

问题是尝试在原子事务中捕获IntegrityError

pytest的家伙帮助修复了@pytest.mark.django_db(transaction=True),而不仅仅是@pytest.mark.django_db

最新更新