Django开发遇两类报错:Slug查询无结果及migrate表已存在
问题排查与解决方案
一、Articles matching query does not exist. 报错解决
核心原因
- 数据库中无对应slug的文章记录,可能是旧文章未生成slug,或请求的slug与数据库存储值不一致
- 自定义
save方法存在参数覆盖问题,导致slug生成逻辑异常 - 视图直接使用
get()方法,未处理记录不存在的场景
解决步骤
补全旧数据的slug
进入Django Shell执行以下命令,为已存在的文章批量生成slug:from bloges.models import Articles from django.utils.text import slugify for article in Articles.objects.filter(slug__isnull=True) | Articles.objects.filter(slug=''): article.slug = slugify(article.Title) article.save()修复
save方法的参数传递
原方法覆盖默认参数,可能导致部分场景下slug不更新,修改为:def save(self, *args, **kwargs): # 仅当slug为空时自动生成,若需修改标题同步更新slug,可移除该判断 if not self.slug: self.slug = slugify(self.Title) super().save(*args, **kwargs)优化视图的异常处理
使用get_object_or_404替代get(),避免直接抛出服务器错误:from django.shortcuts import render, get_object_or_404 from bloges.models import Articles def post(request, slug): articles = get_object_or_404(Articles, slug=slug) return render(request, 'bloges/post-details.html', {"postartic": articles})验证slug一致性
检查数据库bloges_articles表的slug字段值,确认请求URL中的slug与存储值完全匹配(注意大小写、特殊字符转义)
二、django.db.utils.OperationalError: table "bloges_category" already exists 报错解决
核心原因
数据库中已存在bloges_category表,但Django的迁移记录未标记该表已创建,导致migrate时重复执行建表操作
解决步骤
场景1:本地开发环境(数据可重置)
- 删除数据库中的
bloges_category表 - 重新执行迁移命令:
python manage.py makemigrations python manage.py migrate
场景2:生产环境(需保留数据)
- 标记该表的迁移已完成,避免重复建表:
# 重置bloges app的迁移状态 python manage.py migrate --fake bloges zero # 重新生成迁移文件 python manage.py makemigrations bloges # 标记迁移已应用(不实际修改数据库) python manage.py migrate --fake bloges
内容的提问来源于stack exchange,提问作者mobin
相关产品推荐
相关产品推荐

