Django运行报错'function' object has no attribute 'objects'求助
问题原因
报错'function' object has no attribute 'objects'的核心是你代码中调用.objects的blogpost/blogcomment不是Django模型类,而是重名的函数对象。
排查步骤
- 检查views.py顶部的导入逻辑,确认你导入的
blogpost、blogcomment是models.py中定义的模型类,而非其他同名函数。 - 检查命名冲突:你当前使用的小写模型名不符合Django大驼峰命名规范,极易和视图函数、工具方法重名,比如你是否在当前views.py中定义了同名的
blogpost函数?
修复方案
方案1(推荐,符合Django开发规范)
- 先修改models.py中的模型类名为大驼峰格式:
from django.db import models class BlogPost(models.Model): slug = models.SlugField(unique=True) # 其余原有字段保持不变 class BlogComment(models.Model): post = models.ForeignKey(BlogPost, on_delete=models.CASCADE) parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True) sno = models.AutoField(primary_key=True) # 其余原有字段保持不变
- 在views.py顶部正确导入模型:
from .models import BlogPost, BlogComment
- 修改视图代码,同时优化原有不合理的查询逻辑:
def posts(request,slug): # filter返回的是查询集,单篇文章用first()直接取实例,不存在返回404更友好 post = BlogPost.objects.filter(slug=slug).first() if not post: from django.http import Http404 raise Http404("文章不存在") # 单实例直接用post=post查询,不需要用post__in comment = BlogComment.objects.filter(post=post, parent=None) replies = BlogComment.objects.filter(post=post).exclude(parent=None) redict={} for reply in replies: if reply.parent.sno not in redict: redict[reply.parent.sno] = [reply] else: redict[reply.parent.sno].append(reply) context = {'post':post, 'comments':comment, 'redict':redict} return render(request,'blog/blogpost.html', context)
方案2(不修改模型名的临时修复)
如果不想改动模型命名,直接排查重名问题即可:
- 如果是当前文件有同名函数,修改函数名即可
- 如果是导入冲突,导入模型时加别名:
from .models import blogpost as BlogPostModel, blogcomment as BlogCommentModel # 调用时用别名即可 post = BlogPostModel.objects.filter(slug=slug).first()
内容的提问来源于stack exchange,提问作者Labhroop singh
相关产品推荐
相关产品推荐

