You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中Chapter DetailView触发MultipleObjectsReturned错误的问题咨询

问题原因

你的Chapter模型中,chapter_slug仅由number字段生成,不同书籍的同编号章节会产生重复的slug值。而当前ChapterView只通过chapter_slug过滤查询,导致数据库返回多个匹配的Chapter对象,触发MultipleObjectsReturned错误。

解决方案

方案一:修改视图,结合书籍slug过滤查询(推荐)

重写DetailView的get_object方法,同时利用URL中的book_slug和chapter_slug进行联合过滤,确保只返回当前书籍下的目标章节:

class ChapterView(DetailView):
    model = Chapter
    template_name = 'books/chapter.html'
    context_object_name = 'chapter'

    def get_object(self, queryset=None):
        if queryset is None:
            queryset = self.get_queryset()
        # 从URL参数中提取两个slug值
        book_slug = self.kwargs.get('book_slug')
        chapter_slug = self.kwargs.get('chapter_slug')
        # 关联书籍和章节的slug进行精准查询
        return queryset.filter(
            book__book_slug=book_slug,
            chapter_slug=chapter_slug
        ).get()

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        chapter = self.get_object()
        context['book_slug'] = chapter.book.book_slug
        context['chapter_slug'] = chapter.chapter_slug
        ...

方案二:生成全局唯一的chapter_slug

修改Chapter模型的save方法,让chapter_slug结合书籍的唯一标识(如book_slug)生成,确保全局无重复:

def save(self, *args, **kwargs):
    if not self.chapter_slug:
        # 拼接书籍slug和章节号生成唯一slug
        self.chapter_slug = slugify(f"{self.book.book_slug}-{self.number}")
    return super().save(*args, **kwargs)

注意:该方案需要同步更新已有数据的chapter_slug(可通过编写数据迁移脚本实现),且URL中的chapter_slug结构会改变,需同步调整前端链接和相关引用。

内容的提问来源于stack exchange,提问作者ffe6e66e6eff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 16:47:36