django - 为 RelatedManager 创建自定义查询集
django - Creating custom queryset for RelatedManager
我尝试了大约 25 个 Whosebug 链接,但似乎没有人对这个问题有可行的解决方案。
我创建了一个这样的自定义查询集:
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' object has no attribute 'get_active'
到目前为止我尝试过的:
1) 我读到经理 class 中的 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()
知道我做错了什么吗?我将如何解决这个问题?不能太难吧?
谢谢!
罗恩
如the docs state、"Base managers aren’t used when querying on related models"。他们给出的例子是朝另一个方向发展,即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()
我尝试了大约 25 个 Whosebug 链接,但似乎没有人对这个问题有可行的解决方案。
我创建了一个这样的自定义查询集:
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' object has no attribute 'get_active'
到目前为止我尝试过的:
1) 我读到经理 class 中的 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()
知道我做错了什么吗?我将如何解决这个问题?不能太难吧?
谢谢!
罗恩
如the docs state、"Base managers aren’t used when querying on related models"。他们给出的例子是朝另一个方向发展,即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()