django-为RelatedManager创建自定义查询集

时间:2019-06-24 13:30:40

标签: python django django-orm

我尝试了大约25个Stackoverflow链接,但似乎没有人能解决此问题。

我创建了一个这样的自定义查询集:

class ProjectQuerySet(models.QuerySet):
   def get_active(self):
       from apps.projectmanagement.models import Project
       return self.filter(active=True)

class ProjectManager(models.Manager):
  def get_queryset(self):
      return ProjectQuerySet(self.model, using=self._db)

如果我从这样的模型开始,这很好用

Project.objects.get_active()

但是如果我想在关系中使用它,那么到目前为止还没有运气:

employee.projects.get_active()

我总是会收到此错误:

  

AttributeError:'ManyRelatedManager'对象没有属性'get_active'

到目前为止我尝试过的是: 1)我听说经理类中的use_for_related_fields = True已过时。无论如何在django v2.1上不起作用

2)将其添加到我的模型中,互联网状态的一半:

class Project(models.Model):
   ...
   objects = ProjectManager()

   class Meta:
       base_manager_name = 'objects'

3)尝试避免使用RelatedManager并使用查询集:

employee.projects.all().get_active()

有什么想法我做错了吗?我该如何解决呢?不能太辛苦吧?

谢谢!
罗恩

1 个答案:

答案 0 :(得分:1)

the docs state一样,“在查询相关模型时不使用基本管理器”。他们给出的示例是朝另一个方向前进,即project.employee

没有办法使用管理者自己来执行此操作。最好的选择是在模型上定义一个方法:

class Employee(models.Model):
    ...
    def get_active_projects(self):
        return self.projects.filter(active=True)
        # or
        return Project.objects.filter(employee=self).get_active()