完整性错误:更新或删除违反外键约束。 Django + PosrgeSQL

时间:2017-01-16 16:45:04

标签: python django postgresql

这是我的UserProfile修改

 class UserProfile(models.Model):
        user = models.OneToOneField(User)
        fb_id = models.IntegerField(primary_key=True,null=False,blank=True)
        follows = models.ManyToManyField('self', related_name='followed_by', symmetrical=False)
    User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])

尝试删除所有测试用户或其中任何一个用户后,我收到以下错误。

    django.db.utils.IntegrityError: update or delete on table "blog_userprofile" violates foreign key constraint "blog_from_userprofile_id_a482ff43f3cdedf_fk_blog_userprofile_id" on table "blog_userprofile_follows"
DETAIL:  Key (id)=(4) is still referenced from table "blog_userprofile_follows".

默认情况下级联删除是真的,为什么我收到这个,我该如何解决?我正在使用PostgreSQL + Django 1.8

编辑:小先决条件:我将primary_key从默认更改为fb_id。并且有重复,因为它没有设置唯一。因此,当我尝试迁移/ makemigrations / syncdb时会出现此错误:

   django.db.utils.IntegrityError: could not create unique index "blog_userprofile_fb_id_ce4e6e3086081d4_uniq"
DETAIL:  Key (fb_id)=(0) is duplicated.

这就是我试图删除所有测试用户的原因

当我尝试重置所有内容时,我尝试恢复默认主键,我收到:

django.db.utils.ProgrammingError: multiple default values specified for column "id" of table "blog_userprofile"

2 个答案:

答案 0 :(得分:2)

经过多次测试,我发现我的约束没有分配Deferrable和Deferred选项,因为我当前的数据库PostgreSQL是从MySQL迁移的。然后我在DB上手动分配了这个选项并且工作了。

enter image description here

有关此选项的更多信息,请参阅以下链接: Deferrable check constraint in PostgreSQL

我希望这可以提供帮助。

答案 1 :(得分:0)

如果您以前使用过Mysql数据库并更改为Postgres,则可能会遇到此问题。 您需要删除所有应用程序中的迁移文件夹,然后执行全新的“ makemigrations”和“ migrate”以使用postgres重新启动数据库。 为我工作!