Django无法添加或更新子行:外键约束失败

时间:2015-03-19 14:53:03

标签: mysql django foreign-keys

好的,之前提出的类似问题似乎没有对此有正确的答案。 我有一个Django应用程序运行良好但现在使用基于Web的应用程序或命令行中的模型给我上述错误。我的所有表都是Innodb,我运行了syncdb。关闭完整性检查似乎违反直觉。如果我在这里或之前的回复中遗漏了明显的话,我表示歉意。任何帮助,感激不尽。

来自models.py

class difficulty(models.Model):
    difficultyName = models.CharField(max_length=40)
    difficultyDescription = models.CharField(max_length=200)
    blank=False;
    def __unicode__(self):
        return self.difficultyName


class task(models.Model):
    question     = models.CharField(max_length=200)
    dateEntered  = models.DateTimeField('date entered') #, editable=False)
    difficulty   = models.ForeignKey(difficulty)
    taskClass    = models.ManyToManyField(taskClass,related_name ='taskClass')
    keyword      = models.ManyToManyField(keyword)
    service      = models.ManyToManyField(service)#, default = service.objects.get(serviceName='Medicine'))
    answer       = models.ManyToManyField(answer,  related_name = 'taskAnswer')
    def __unicode__(self):
        return "A task - {0}\n with difficulty {1}\n and date {2}\n".format(self.question, self.difficulty, self.dateEntered)

在views.py中,对象被实例化并保存如下

if form.is_valid():                         # All validation rules pass
    theNewTask = form.save(commit=False)
    theNewTask.dateEntered = timezone.now()
    theNewTask.save()      # the rest of the method deals with many-to-many relationships in the task class

在通过基于模板的Web表单处理时出现以下错误:

  

异常值:(1452,'无法添加或更新子行:异类   键约束失败(djangoimptwomt_task,CONSTRAINT   difficulty_id_refs_id_eca4bfb0外键(difficulty_id)   参考TwoMT_difficultyid))')

使用python命令行中的类:

>> import twomt.models as T
>> from django.utils import timezone
>> task = T.task(question="where is spain")
>> task.dateEntered = timezone.now()
>> task.difficulty = T.difficulty.objects.get(id=2)
>> task.save()

给出错误:

  

Traceback(最近一次调用最后一次):----剔除了追溯---   IntegrityError:(1452,'无法添加或更新子行:异类   键约束失败(djangoimptwomt_task,CONSTRAINT   difficulty_id_refs_id_eca4bfb0外键(difficulty_id)   参考TwoMT_difficultyid))')

但是实例化的类很好:

>>> print task
A task - where is spain
 with difficulty Medium
 and date 2015-03-19 11:19:04.494322+00:00

>>> print  T.difficulty.objects.get(id=2)
Medium

显示来自TwoMT_task的列

Field           Type           Null   Key     Default   Extra
'question',     'varchar(200)','NO',  '' ,    NULL,     ''
'id',           'int(11)',     'NO',  'PRI',  NULL,     'auto_increment'
'difficulty_id','int(11)',     'NO',  'MUL',  NULL,      ''
'dateEntered',  'datetime',    'NO',  ' ',    NULL,      ''

显示来自twomt_difficulty的列

Field                  Type           Null   Key     Default   Extra
'id',                  'int(11)',     'NO',  'PRI',  NULL,     'auto_increment'
'difficultyName',      'varchar(40)', 'NO',   '',    NULL,     ''
'difficultyDescription','varchar(200)','NO',  '',    NULL,     ''

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,并通过以下链接解决了该问题:

https://logic.edchen.org/how-to-resolve-error-1452-23000-cannot-add-or-update-a-child-row-a-foreign-key-constraint-fails/

恢复(来自链接):

生成错误1452(23000),因为引用表订单的子列cid中的某些当前值不在引用表客户的父列ID中。在我们实际创建约束之前,它已经违反了约束规则。因此,MySQL无法创建约束。

解决方案

因此,现在,您必须确定违反约束的行并进行更正。辛苦了吗?并不是的。您可以使用以下语句标识行:

mysql> select * from orders where cid not in (select distinct id from customers);

答案 1 :(得分:-1)

当您实际执行某些迁移,撤消它们并再次迁移它们然后删除上次迁移文件时,会发生这种情况。

示例,

  

在XYZ类中添加了一个字段 - >迁移。

     

删除该字段 - >再次迁移。

     

现已删除最近2个已迁移的文件。

所以Model.py保持不变,一切都保持不变但你删除了那些迁移文件。 在Model.py中编辑内容并再次迁移后,它将正常工作。