Django中的ManyToManyField完整性错误 - 为什么?

0 投票
1 回答
1243 浏览
提问于 2025-04-16 19:51

我有两个模型,分别是 News(新闻)和 Page(页面),而 News 模型里有两个字段是用来关联 Page 的:

chapter   = models.ForeignKey('pages.Page', 
     verbose_name='Main chapter', 
     limit_choices_to={'type__in':['news','speech']}, 
     related_name='news'
)

add_chapters = models.ManyToManyField('pages.Page', blank=True, null=True, 
        verbose_name='Show also on', 
        limit_choices_to={'allow_add_news':True},
        related_name="added_news"
)

问题是,当我试图在 Django 管理后台保存 News(并且选择了一些页面来添加章节)时,我遇到了这个错误:

IntegrityError(1452,'无法添加或更新子行:外键约束失败 (site.news_news_add_chapters, 约束 news_id_refs_id_479506ad 外键 (news_id) 参考 news_news (id)')

这是怎么回事呢?

1 个回答

0

我在使用Django 1.2和sqlite、mysql时,这个方法都能正常工作。我觉得你的数据库设计可能有问题。试着在一个新的数据库上运行一下,看看是否能正常工作。

(检查一下你的代码 - 记住,type是Python的内置函数。你有没有在某个地方用type代替self.type?)

我用的代码是:

# models.py
class Page(models.Model):
    name = models.CharField(max_length=128)
    type = models.CharField(max_length=128, default="news")
    allow_add_news = models.BooleanField(default=True)

class News(models.Model):
    name = models.CharField(max_length=128)
    chapter   = models.ForeignKey(Page, 
     verbose_name='Main chapter', 
     limit_choices_to={'type__in':['news','speech']}, 
     related_name='news'
    )

    add_chapters = models.ManyToManyField(Page, blank=True, null=True, 
            verbose_name='Show also on', 
            limit_choices_to={'allow_add_news':True},
            related_name="added_news"
    )

撰写回答