美文网首页
Django 框架之 自定义manager

Django 框架之 自定义manager

作者: Spareribs | 来源:发表于2016-12-17 23:59 被阅读622次

知识点

  1. Manager基本概念
  2. 简单使用默认Manager
  3. 为什么要定制Manager
  4. 编码定制

参考文档

代码地址:Spareibs的Github

Manager基本概念

Manager是django模型进行数据库查询操作的接口。Django 应用的每个模型都拥有至少一个管理器。

实验步骤

app下面的modules.py文件先创建一个module

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)

将ToDo的module注册[app下面的admin.py]

from polls.models import ToDo
admin.site.register(ToDo)

数据库同步

同步完成以后,直接随机录入数据

(env_py35_django) D:\MaiZi_Edu\Dropbox\Maizi\Django_up\class_04_ol>python manage.py makemigrations
Migrations for 'polls':
  0006_todo.py:
    - Create model ToDo

(env_py35_django) D:\MaiZi_Edu\Dropbox\Maizi\Django_up\class_04_ol>python manage.py migrate
Operations to perform:
  Apply all migrations: auth, sessions, polls, admin, contenttypes
Running migrations:
  Applying polls.0006_todo... OK

修改url的配置

projects的urls的配置

from django.conf.urls import include

urlpatterns = [
    url(r'', include('polls.urls')),
]

app的urls配置

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.home, name='home'),
    url(r'^todoList/', views.todoList, name="todoList")
]

设置views文件

def todoList(request):
    return render(request, 'todoList.html', {"showType": "所有事件列表", "todoList": ToDo.objects.all()})

设置html模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<p> {{ showType }} </p>
<div>
    {% for todoItem in todoList %}
        <p>
        {{ todoItem.content }} {{ todoItem.is_done }} {{ todoItem.priority }}
        </p>
    {% endfor %}
</div>
</body>
</html>

自定义manger

给ToDo自定义manger

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)
    
    # 这燕子修改以后,views就不能用默认的objects来调用,提示:type object 'ToDo' has no attribute 'objects'
    todolists = models.Manager()

修改后的views文件

def todoList(request):
    return render(request, 'todoList.html', {"showType": "所有事件列表", "todoList": ToDo.todolists.all()})

过滤数据

使用filter方法

def todoList(request):
    return render(request, 'todoList.html',
                  {"showType": "所有事件列表", "todoList": ToDo.todolists.all().filter(is_done=False).filter(priority=1)})

自定义方法(未完成事件)

先自定义一个子类【modules.py】

# IncompleteTodoManager是继承Manager的一个子类,返回未完成的事件的结果集
class IncompleteTodoManager(models.Manager):
    # 重载get_queryset的方法
    def get_queryset(self):
        return super(IncompleteTodoManager, self).get_queryset().filter(is_done=False)

在模型中实例化【modules.py】

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)

    # 这燕子修改以后,views就不能用默认的objects来调用
    todolists = models.Manager()
    # 实例化一个IncompleteTodoManager,结果集是未完成的事件数据
    incomplete = IncompleteTodoManager()

调用方法【views.py】

def todoList(request):
    return render(request, 'todoList.html', {"showType": "所有事件列表", "todoList": ToDo.incomplete.all()})

自定义方法(高优先级)

先自定义一个子类【modules.py】

class HighPriorityManager(models.Manager):
    # 重载get_queryset的方法
    def get_queryset(self):
        return super(HighPriorityManager, self).get_queryset().filter(priority=1)

在模型中实例化【modules.py】

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)

    # 这燕子修改以后,views就不能用默认的objects来调用
    todolists = models.Manager()
    # 实例化一个IncompleteTodoManager,结果集是未完成的事件数据
    incomplete = IncompleteTodoManager()
    high = HighPriorityManager()

调用方法【views.py】

def todoList(request):
    return render(request, 'todoList.html', {"showType": "所有事件列表", "todoList": ToDo.high.all()})

一个子类同时定义两个方法

先自定义一个子类【modules.py】

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

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

在模型中实例化【modules.py】

class ToDo(models.Model):
    # 实例化
    objects = ToDoManager()

调用方法【views.py】

# 输出所有未完成的事件
def todoList(request):
    return render(request, 'todoList.html', {"showType": "所有事件列表", "todoList": ToDo.objects.incomplete()})

# 输出指定优先级的事件
def todoList(request):
    return render(request, 'todoList.html', {"showType": "所有事件列表", "todoList": ToDo.objects.high()})

通过QuerySet方法来实现

先自定义一个子类【modules.py】

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

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

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

在模型中实例化【modules.py】

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()

调用方法【views.py】

# 输出指定优先级的事件
def todoList(request):
    return render(request, 'todoList.html', {"showType": "所有事件列表", "todoList": ToDo.objects.all().high().})
    
# 输出所有未完成指定优先级的事件
def todoList(request):
    return render(request, 'todoList.html', {"showType": "所有事件列表", "todoList": ToDo.objects.all().high().incomplete()})

优化QuerySet方法来实现的Manager,减少all()方法的调用

先自定义一个子类【modules.py】

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

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

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()

在模型中实例化【modules.py】

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()

调用方法【views.py】

# 输出指定优先级的事件
def todoList(request):
    return render(request, 'todoList.html', {"showType": "所有事件列表", "todoList": ToDo.objects).high().})
    
# 输出所有未完成指定优先级的事件
def todoList(request):
    return render(request, 'todoList.html', {"showType": "所有事件列表", "todoList": ToDo.objects.high().incomplete()})

相关文章

网友评论

      本文标题:Django 框架之 自定义manager

      本文链接:https://www.haomeiwen.com/subject/oeysmttx.html