You need to enable JavaScript to run this app. 如何在Django自定义QuerySet中访问关联模型集合并添加注解字段?
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django自定义QuerySet中访问关联模型集合并添加注解字段?

问题原因

b_set是单个A模型实例才有的反向关联属性,CustomQuerySet是A模型的查询集合对象,本身不具备该实例属性,所以会触发属性不存在的报错。

解决方案

你可以直接使用Django ORM的Count聚合函数配合跨关系查询语法实现需求,全程只执行1次SQL,无额外查询开销,符合你的性能要求。

修正后完整代码

from django.db import models
from django.db.models import Count

class CustomQuerySet(models.QuerySet):
  def my_func(self):
     # 未设置related_name时,反向关联查询默认用关联模型小写名b即可
     return self.annotate(b_count=Count('b'))

class A(models.Model):
  objects = CustomQuerySet.as_manager()

class B(models.Model):
  a = models.ForeignKey(A, on_delete=models.CASCADE)

使用方法

调用A.objects.my_func().all()后,返回的每个A实例都会自动带上b_count注解字段,直接访问该属性即可获取关联B的数量,不会触发额外的数据库请求。

注意事项

如果你给B模型的外键字段设置了自定义related_name,需要把Count的参数替换为你设置的related_name值,例如:

  • 外键定义为a = models.ForeignKey(A, related_name='b_objs', on_delete=models.CASCADE)
  • 注解写法就要改为Count('b_objs')

内容的提问来源于stack exchange,提问作者Aleks Kuznetsov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 03:27:02