Django 自定义模型管理器

标签 django django-models django-managers

我对使用 Django 自定义模型管理器的正确方法感到困惑 - 根据文档,您可以为一个模型创建一系列管理器作为过滤方式。但是为什么不创建一个带有一系列过滤功能的管理器类呢?一种方法比另一种更好吗?为什么?

例如:

class MaleManager(models.Manager):
    def get_query_set(self):
        return super(MaleManager, self).get_query_set().filter(sex='M')

class FemaleManager(models.Manager):
    def get_query_set(self):
        return super(FemaleManager, self).get_query_set().filter(sex='F')

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    sex = models.CharField(max_length=1, choices=(('M', 'Male'), ('F', 'Female')))
    people = models.Manager()
    men = MaleManager()
    women = FemaleManager()


class PersonManager(models.Manager):
    def males(self):
        return super(MaleManager, self).get_query_set().filter(sex='M')

    def females(self):
        return super(FemaleManager, self).get_query_set().filter(sex='F')

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    sex = models.CharField(max_length=1, choices=(('M', 'Male'), ('F', 'Female')))
    people = PersonManager()

Person.people.females() # to get list of females
Person.people.males() # to get a list of males

最佳答案

使用第一种方法,您可以编写:

men = Person.men.all()


peters_men = Person.men.filter(first_name='Peter')

对于第二个方法 get_query_set 是从模型“继承”,然后它返回没有自定义的查询集。我不知道有什么理由放弃你的第二种方法,如果你使用的是管理界面,你应该检查这是否受支持。

另外,对于第二种方法,您应该更正您的问题。是
class PersonManager(models.Manager):
    def males(self):
        return super(PersonManager, self).get_query_set().filter(sex='M')

Read django manager doc :“您可以通过覆盖 Manager.get_query_set() 方法来覆盖 Manager 的基本 QuerySet。get_query_set() 应该返回一个具有您需要的属性的 QuerySet。”

2017 年编辑 小心,get_query_set从 djanto 1.7 重命名为 get_queryset .更多信息请访问 Modifying a manager’s initial QuerySet

关于Django 自定义模型管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8115009/

相关文章:

python - Django Rest框架: passing queryset to Response()

django - 在 Django 管理员中,如何将博客文章设置为仅在它不是草稿时进行验证?

python - 在 django 中省略模型 "save"上的字段

django - 如何重写自定义管理器类中的 .update() 方法

python - 将 django sqlite 数据库迁移到 postgresql

django - 谷歌应用引擎和 Django 沙盒 : Shell and Web seem to be using different datastores?

Django 和领域层

django - 不破坏 DRY 的自定义 QuerySet 和管理器?

python - 如何在 Django View 中定义 get_queryset、get_context_data?

jquery - Django,类别和子类别