Django模型用@property筛选无博客用户,模板调用count失效问题
解决未拥有博客用户统计的问题
先给你捋捋现有代码里的几个核心问题:
- 你给
DOESN_HAVE_BLOG加了@property装饰器,但这个装饰器是给单个Blog实例用的,而你要做的是全局用户统计,直接在模板里调用类属性肯定没法正常工作。 - 代码里的
Self.Blog和Self.User都是错误写法:Self拼写错误,而且访问模型查询集应该用Blog.objects.all(),关联的用户模型是Employee不是User。 - 这种跨模型的统计逻辑,不该绑定在Blog的实例属性上,它和单个博客实例完全无关。
下面给你两种实用的解决办法:
方法一:用模型管理器(推荐)
在Blog模型里自定义一个管理器方法,专门处理无博客用户的查询逻辑:
from django.db import models class BlogManager(models.Manager): def get_users_without_blog(self): # 获取所有拥有博客的用户ID(去重避免重复统计) user_ids_with_blog = Blog.objects.values_list('user__id', flat=True).distinct() # 排除已有博客的用户,剩下的就是目标用户 return Employee.objects.exclude(id__in=user_ids_with_blog) class Blog(models.Model): desc = models.TextField(blank=True, null=True) user = models.ForeignKey(Employee, null=True, on_delete=models.CASCADE, related_name='blogs') # 替换默认的模型管理器 objects = BlogManager()
然后在视图里把查询结果传给模板:
def your_view(request): users_without_blog = Blog.objects.get_users_without_blog() return render(request, 'mytemplate.html', {'users_without_blog': users_without_blog})
最后在模板里调用统计数:
{{ users_without_blog.count }}
方法二:直接在视图里处理逻辑
如果不想修改模型,也可以把统计逻辑直接写在视图里:
def your_view(request): # 获取所有有博客的用户ID user_ids_with_blog = Blog.objects.values_list('user__id', flat=True).distinct() # 计算无博客用户数量 users_without_blog_count = Employee.objects.exclude(id__in=user_ids_with_blog).count() return render(request, 'mytemplate.html', {'users_without_blog_count': users_without_blog_count})
模板里直接使用传递过来的数值:
{{ users_without_blog_count }}
小提示
- 加上
distinct()是为了避免同一个用户多篇博客导致ID重复,让查询更高效准确。 - 以后写模型逻辑时,
@property适合描述单个实例的属性(比如某篇博客的字数),全局统计类的逻辑放在管理器或者视图里更合理。
内容的提问来源于stack exchange,提问作者Budi Gunawan
相关产品推荐
相关产品推荐

