mysql - Django 管理多对多错误

标签 mysql django admin

我正在使用内置的 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, 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"

最佳答案

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

关于mysql - Django 管理多对多错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16887064/

相关文章:

php - 读取和插入大表时出现 503 错误?

mysql - MySQL 中的所有行对其他用户不可见

django-allauth HTML 电子邮件不发送

django - 将 Django 模型迁移到 Postgresql 模式

date - Magento 1.9 错误的客户创建和上次登录日期

Django 管理员不工作/丑陋 - 使用 nginx 和 Gunicorn 提供服务

php - 带有参数的joomla mysql查询

mysql - 当我尝试创建表时出现错误,但我不明白为什么

python - PyCharm,Django : zero code coverage

php - 在 PHP 中检查用户是否是管理员