Django和Postgres的外键约束违规

时间:2015-07-15 18:48:54

标签: django mongodb postgresql migration

当我尝试填充数据时,我在Django 1.7中的两个模型之间遇到外键约束违规。

第一个模型是Specialty,一个简单的名称占位符,如下所示:

class Specialty(MongoidModel):
    name = models.CharField(max_length=100)

引用它的模型Job,看起来像这样:

class Job(MongoidModel):
    specialty = models.ForeignKey(
        Specialty,
        null=True,
        blank=True
     )

这两个都继承了MongoidModel,它只是一个包含id,created_at日期和updated_at日期的自定义模型,用于从原始Mongo数据库移植数据。

Makemigrations运行正常,迁移也运行良好,但当我实际尝试移植所有Job对象时,我立即收到此错误:

django.db.utils.IntegrityError: insert or update on table "jobs_job" 
violates foreign key constraint "D76699ba021e613d02bad10e8fb41f69"
DETAIL:  Key (specialty_id)=(None) is not present in table
"specializations_specialty".

查看导致崩溃的具体工作表明它包含专业的无,因为许多工作没有专业。

我的理解是数据库正在尝试查找id为None的特殊对象,并且失败了。我认为这就是在ForeignKey定义中的空白= True和null = True应该优雅地避免,不让它到达那个状态,只是让关联谎言?

2 个答案:

答案 0 :(得分:0)

  1. 如果将数据库切换到Sqlite3,这是否有效?

  2. 您确定自己已经manage.py makemigrations specialtymanage.py migrate了吗?否则,可能存在陈旧约束。

答案 1 :(得分:0)

事实证明,答案就是我创建模型的方式。当我有一个作家以“无”作为他们的专业时,我还在通过那个领域:

{'writer_name': 'Bob', 'specialty_id':None} 

到对象映射器/对象创建器,并且django正在寻找None作为Specialty表中的键。正确的做法是检查special_id是否为None,然后将它从mapper / object creator中一起排除:

{'writer_name': 'Bob'}

感谢您提供了有用的评论,我学到了很多东西!