python - 从 Django 中的自定义查询集访问相关集?
问题描述
我想通过自定义查询集为我的模型注释附加字段并使用函数访问它,这是一个简化的代码:
class CustomQuerySet(models.QuerySet):
def my_func(self):
return self.annotate(b_count=self.b_set.count()) # 'CustomQuerySet' object has no attribute 'b_set'
class A(models.Model):
objects = CustomQuerySet.as_manager()
class B(models.Model):
a = models.ForeignKey(A)
我想像这样访问它models.A.objects.my_func().all()
,所以当我想获取它时,会在我的模型中添加一个额外的字段。
但我无法b_set
从CustomQuerySet
.
以前我使用的是@property
in model A
,但它每次都会发出额外的数据库请求。
如何从自定义查询集中访问一组相关模型?
解决方案
可能,您应该看看Manager
完全符合您要求的示例:https ://docs.djangoproject.com/en/3.2/topics/db/managers/#adding-extra-manager-methods
from django.db import models
from django.db.models.functions import Coalesce
class PollManager(models.Manager):
def with_counts(self):
return self.annotate(
num_responses=Coalesce(models.Count("response"), 0)
)
class OpinionPoll(models.Model):
question = models.CharField(max_length=200)
objects = PollManager()
class Response(models.Model):
poll = models.ForeignKey(OpinionPoll, on_delete=models.CASCADE)
# ...
在您的示例中,我认为您无法访问b_set
,因为此属性属于模型实例,而不是查询集本身。
推荐阅读
- python - Python - 不等于或的逻辑 - 让所有选择都通过
- javascript - Ajax 将数据发布到 php 成功但不发布超过 12k 长度的数据
- scala - Spark - 查找两个不同列中每个不同值的总出现次数
- ios - 如何在 SwiftUI 中缩小一个填充以为另一个填充提供空间?
- wordpress - API返回x-wp-doingitwrong ...但我已经返回true
- express - 使用 Express 构建反向代理
- vue.js - 指定要在组件中使用的 Vuex 存储
- r - 如何从 R 中的多重模拟中的总和结果中提取或打印出特定的数据列?
- vb6 - vb6 文件写入限制似乎是 0x4000
- npm - 在 Cypress 测试运行器的命令行启动中指定 --reporter 和 --env