Django如何获取查询集中每个实例的外键关联对象计数?
解决方案
方法1:使用ORM聚合查询(推荐,性能最优)
直接在视图层对Poller查询集使用annotate配合Count聚合,单次查询即可拿到所有Poller的评论数,无需修改模型,不会触发循环导入:
from django.db.models import Count from app_a.models import Poller from app_b.models import PollerComment def render_pollboard(request): # annotate 直接给每个实例追加评论数字段 poller_queryset = Poller.objects.annotate( comment_count=Count('PollerComment') # 这里直接使用你定义的related_name即可 ).all() qs_list = list(poller_queryset) shuffle(qs_list) # 直接使用属性即可,比如遍历场景 for poller in qs_list: print(f"Poller {poller.poller_id} 的评论数:{poller.comment_count}") # 后续业务逻辑...
方法2:批量统计后手动赋值(适合已完成查询打乱的场景)
如果你不想修改原有Poller查询逻辑,也可以先拿到所有Poller的ID,批量统计评论数后映射到每个实例上:
from django.db.models import Count from app_a.models import Poller from app_b.models import PollerComment from random import shuffle def render_pollboard(request): poller_queryset = Poller.objects.all() qs_list = list(poller_queryset) shuffle(qs_list) # 批量获取所有评论数,生成ID到数量的映射字典 poller_ids = [p.poller_id for p in qs_list] comment_count_map = dict( PollerComment.objects.filter(poller_id__in=poller_ids) .values_list('poller_id') .annotate(count=Count('id')) ) # 给每个Poller实例追加评论数属性 for poller in qs_list: poller.comment_count = comment_count_map.get(poller.poller_id, 0) # 后续业务逻辑...
补充说明
两种方案均在视图层实现逻辑,不需要修改app_a下的Poller模型代码,也不需要在app_a/models.py中导入app_b的模型,完全避开循环导入问题。
小提示:你当前定义的related_name为
PollerComment,不符合Django常规命名规范,建议后续调整为小写复数形式如poller_comments,可读性更好。
内容的提问来源于stack exchange,提问作者JSRB
相关产品推荐
相关产品推荐

