我正在使用内置的 django 管理站点来保存具有 ManyToMany 字段的模型的实例。如果我在管理站点中保存而不是更新模型,而没有为 ManyToMany 字段设置值,则可以很好地保存。我还可以在保存模型后返回并设置 ManyToMany 字段,这样就可以了。但是,如果我尝试保存模型“Exercise”的新实例,该实例具有 ManyToMany 字段“Exercise.muscles”设置,我会收到以下错误:
(1452, 'Cannot add or update a child row: a foreign key constraint fails (
vitality
.projectvitality_exercise_muscles
, CONSTRAINTexercise_id_refs_exercise_id_a5d4ddd6
FOREIGN KEY (exercise_id
) REFERENCESprojectvitality_exercise
(exercise_id
))')
我的 mysql 表设置为 INNODB。
我的模型如下:
class Muscle(models.Model):
def format(self):
return "name:{0}:".format(self.name)
def __unicode__(self):
return unicode(self.name)
muscle_id = UUIDField(primary_key = True)
name = models.CharField(max_length=30, blank=False, default="")
medical = models.CharField(max_length=150, blank=True, default="")
description = models.TextField(blank=True, default="")
class Exercise(models.Model):
def format(self):
return "name:{0}".format(self.name)
def __unicode__(self):
return unicode(self.name)
ISOLATION_TYPE = "isolation"
COMPOUND_TYPE = "compound"
FULL_BODY_TYPE = "full"
EXERCISE_TYPES = (
(ISOLATION_TYPE, "Isolation"),
(COMPOUND_TYPE, "Compound"),
(FULL_BODY_TYPE, "Full Body")
)
UPPER_BODY_GROUP = "upper"
LOWER_BODY_GROUP = "lower"
GROUP_CHOICES = (
(UPPER_BODY_GROUP, "Upper Body"),
(LOWER_BODY_GROUP, "Lower Body")
)
exercise_id = UUIDField(primary_key=True)
name = models.CharField(max_length=30, default="", blank=False)
description = models.TextField(blank=True, default="")
group = models.CharField(max_length=255,
choices=GROUP_CHOICES,
blank=False,
default=UPPER_BODY_GROUP)
exercise_type = models.CharField(max_length=255,
choices=EXERCISE_TYPES,
blank=False,
default=ISOLATION_TYPE)
muscles = models.ManyToManyField('Muscle', blank=True, null=True)
class Meta:
verbose_name = "Exercise"
verbose_name_plural = "Exercises"
最佳答案
经过几天的调试,我发现了这个问题。在我的代码中,我使用 django-extensions 库中的 UUIDField 作为主键。保存练习模型的新实例时,它能够生成、设置和保存主键。但是,在保存设置了 ManyToMany 字段的练习的新实例时,不会及时生成 UUIDField。这导致 Django 管理员尝试将空/空主键(练习模型中的 UUIDField)插入到连接表中,从而触发外键约束失败。
关于mysql - Django 管理多对多错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16887064/