首页 > 解决方案 > 从 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_setCustomQuerySet.

以前我使用的是@propertyin model A,但它每次都会发出额外的数据库请求。

如何从自定义查询集中访问一组相关模型?

标签: pythonpython-3.xdjangodjango-models

解决方案


可能,您应该看看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,因为此属性属于模型实例,而不是查询集本身。


推荐阅读