2017-12-27 159 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