2013-06-02 49 views
0

我正在使用内置的django管理站点来保存具有ManyToMany字段的模型的实例。如果我保存,不更新,管理网站中的模型没有为ManyToMany字段设置值,它可以很好地保存。保存模型后,我也可以返回并设置ManyToMany字段,该字段有效。但是,如果我试图挽救我的模型,运动,具有多对多场,Exercise.muscles,设置出现以下错误的一个新实例:Django Admin ManyToMany错误

(1452, 'Cannot add or update a child row: a foreign key constraint fails (vitality . projectvitality_exercise_muscles , CONSTRAINT exercise_id_refs_exercise_id_a5d4ddd6 FOREIGN KEY (exercise_id) REFERENCES projectvitality_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" 

回答

0

调试后几天,我发现这个问题。在我的代码中,我使用django-extensions库中的UUIDField作为主键。保存练习模型的新实例时,它可以生成,设置和保存主键。但是,在保存设置了ManyToMany字段的练习的新实例时,不会及时生成UUIDField。这导致Django管理员试图在练习模型中插入空/空主键UUIDField到连接表中,该连接表触发外键约束失败。