2013-06-02 51 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到連接表中,該連接表觸發外鍵約束失敗。