![](/img/trans.png)
[英]Django: how to order a queryset by a related object if it exists and by a field if it doesn't?
[英]How to disallow creation of object if related foreign key doesn't exists?
這是設置
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
>引發IntegrityError->處理它(例如,創建id=1
對象A
並重新運行)。
盡管具有外鍵約束,還是創建了對象B
,但拋出了IntegrityError( Key (a_id)=(1) is not present in table "app_a"
),但是try / except並未獲取它。 一切都搞砸了。
我沒有什么get_or_create
對象A
因為每次我要創建B
時都會以2個查詢結束(而且我需要多次創建它,而大多數時候所需的對象A
已經在數據庫中)
事實證明,問題出在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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.