【问题标题】:Access related set from a Custom QuerySet in Django?从 Django 中的自定义查询集访问相关集?
【发布时间】:2021-07-30 06:24:08
【问题描述】:

我想通过自定义查询集为我的模型注释附加字段并使用函数访问它,这是一个简化的代码:

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() 这样访问它,所以当我想获取它时,会在我的模型中添加一个额外的字段。

但我无法从CustomQuerySet 访问b_set

以前我在模型A 中使用@property,但它每次都会发出额外的数据库请求。

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

【问题讨论】:

    标签: python python-3.x django django-models


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2018-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 2021-02-07
      • 2010-10-14
      • 1970-01-01
      相关资源
      最近更新 更多