2017-12-27 202 views
1

我有兩個模型,如IntegrityError當刪除模型實例

class A(models.Model): 
    title = models.CharField(max_length=255) 

class B(models.Model): 
    recommendation = models.ForeignKey(A, related_name="+") 
    title = models.CharField(max_length=255) 

當我刪除了一個模型的實例,我得到的是這樣的:

IntegrityError: update or delete on table "myapp_a" violates foreign key constraint "myapp_relate_recommendation_id_4a7c5340_fk_myapp_a_id" on table "myapp_b" 
Detail: Key (id)=(27527) is still referenced from table "myapp_b". 

我想不通爲什麼它會發生,我認爲FK應該被默認刪除。

回答

1

嘗試添加on_delete參數傳送給recommendation領域:

models.py

class A(models.Model): 
    title = models.CharField(max_length=255) 

class B(models.Model): 
    recommendation = models.ForeignKey(A, related_name="+", on_delete=models.CASCADE) 
    title = models.CharField(max_length=255) 

運行python manage.py shell

>>> from abtest.models import A, B 
>>> a = A(title="test A title") 
>>> a.save() 
>>> a 
<A: A object (1)> 
>>> b = B(title="test B title", recommendation=a) 
>>> b.save() 
>>> b 
<B: B object (1)> 
>>> b.recommendation 
<A: A object (1)> 
>>> a.delete() 
(2, {'abtest.B': 1, 'abtest.A': 1}) 

您可以瞭解更多關於Django的如何處理外來鍵刪除here

+0

嗯,我已經試過了,它沒有工作。我認爲models.CASCADE是默認行爲。 –

+0

你使用的是什麼版本的Django?我剛剛使用Django 2.0測試了我上面發佈的解決方案,它工作正常。實際上,'makemigrations'只會在我爲ForeignKey字段添加一個'on_delete'參數的情況下運行;否則,遷移會引發錯誤。我已經使用控制檯的輸出更新了我的回覆。 – Sam