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
相关产品推荐
相关产品推荐

