Skip to content

Latest commit

 

History

History
88 lines (66 loc) · 2.66 KB

20171206_03.md

File metadata and controls

88 lines (66 loc) · 2.66 KB

django技巧#8 自定义管理器

作者

jwh5566

日期

2017-12-06

标签

Python3.6 ,Django 1.11, 自定义管理器


第一种方式,定义model.Manager的子类,实现get_queryset方法,在模型中定义管理器的实例

class IncompleteTodoManager(models.Manager):  # 自定义管理器子类
    def get_queryset(self):
        return super(IncompleteTodoManager, self).get_queryset().filter(is_done=False)


class HighPriorityManager(models.Manager):
    def get_queryset(self):
        return super(HighPriorityManager, self).get_queryset().filter(priority__gt=1)


class ToDo(models.Model):
    content = models.CharField(max_length=200)
    is_done = models.BooleanField(default=False)
    priority = models.IntegerField(default=1)

    def __str__(self):
        return "%s-%d" %(self.content, self.priority)

    todoLists = models.Manager()   #  重命名默认的管理器
    incomplete = IncompleteTodoManager() # 定义自定义管理器的实例
	high = HighPriorityManager()

第二种方式,定义model.Manager的子类,实现自定义的方法,在模型中定义管理器的实例

class ToManager(models.Manager):
    def incomplete(self):
        return self.filter(is_done=False)

    def high(self):
        return self.filter(priority__gt=1)

第三种方式,定义model查询集子类,实现自定义方法,定义自定义管理器,返回自定义查询集实例

class TodoQueryset(models.QuerySet):
    def incomplete(self):
        return self.filter(is_done=False)

    def high(self):
        return self.filter(priority__gt=1)


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


class ToDo(models.Model):
    content = models.CharField(max_length=200)
    is_done = models.BooleanField(default=False)
    priority = models.IntegerField(default=1)

    def __str__(self):
        return "%s-%d" %(self.content, self.priority)

    # objects = newTodoManager()
    object = TodoQueryset.as_manager()  # 调用查询集的方法生成管理器,可以不用定义管理器
    todoLists = models.Manager()
    incomplete = IncompleteTodoManager()
    high = HighPriorityManager()

可以在view中调用管理器的时候,省略all查询集的调用

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

    def incomplete(self):
        return self.get_queryset().incomplete()

    def high(self):
        return self.get_queryset().high()