如何在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
相关产品推荐
相关产品推荐

