Django模型将CharField改为ForeignKey后URL无法正常工作如何解决?
问题原因
你将category字段从CharField改为ForeignKey后,Post模型的category字段存储的是关联分类表的主键ID值,不再直接存储分类名称。你查询时传入了分类名称字符串health,Django默认会把该值当做分类ID解析,类型不匹配就触发了报错。
解决方案
有两种常用修复方案,按需选择即可:
方案1:跨表查询分类名称(无需修改现有URL规则,改动最小)
修改views.py中的过滤逻辑,通过双下划线__指定关联分类表的name字段做匹配:
def CategoryView(request, cats): category_name = cats.replace('-', ' ') # 双下划线表示跨表查询category关联表的name字段 category_posts = Post.objects.filter(category__name=category_name) return render(request, 'categories.html', {'cats': category_name, 'category_posts': category_posts})
注意:建议给category模型的name字段加unique=True约束,避免分类重名导致查询结果异常。
方案2:先查询分类实例再过滤(逻辑更健壮,可捕获分类不存在的场景)
def CategoryView(request, cats): category_name = cats.replace('-', ' ') try: # 先查询对应名称的分类实例 cate = category.objects.get(name=category_name) category_posts = Post.objects.filter(category=cate) except category.DoesNotExist: # 分类不存在时返回空结果 category_posts = Post.objects.none() return render(request, 'categories.html', {'cats': category_name, 'category_posts': category_posts})
额外规范建议
Python类名默认遵循大驼峰命名规则,你的category模型类名建议改为Category,和Django官方编码规范对齐,避免后续出现隐性问题。
内容的提问来源于stack exchange,提问作者Dinindu Theekshana
相关产品推荐
相关产品推荐

