簡體   English   中英

如果相關外鍵不存在,如何禁止創建對象?

[英]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已經在數據庫中)


編輯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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM