知識點
- Manager基本概念
- 簡單使用默認(rèn)Manager
- 為什么要定制Manager
- 編碼定制
參考文檔
Manager基本概念
Manager是django模型進(jìn)行數(shù)據(jù)庫查詢操作的接口主守。Django 應(yīng)用的每個模型都擁有至少一個管理器信轿。
實驗步驟
app下面的modules.py文件先創(chuàng)建一個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)
數(shù)據(jù)庫同步
同步完成以后编振,直接隨機錄入數(shù)據(jù)
(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")
]
設(shè)置views文件
def todoList(request):
return render(request, 'todoList.html', {"showType": "所有事件列表", "todoList": ToDo.objects.all()})
設(shè)置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就不能用默認(rèn)的objects來調(diào)用妄均,提示:type object 'ToDo' has no attribute 'objects'
todolists = models.Manager()
修改后的views文件
def todoList(request):
return render(request, 'todoList.html', {"showType": "所有事件列表", "todoList": ToDo.todolists.all()})
過濾數(shù)據(jù)
使用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的一個子類宾巍,返回未完成的事件的結(jié)果集
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就不能用默認(rèn)的objects來調(diào)用
todolists = models.Manager()
# 實例化一個IncompleteTodoManager滨攻,結(jié)果集是未完成的事件數(shù)據(jù)
incomplete = IncompleteTodoManager()
調(diào)用方法【views.py】
def todoList(request):
return render(request, 'todoList.html', {"showType": "所有事件列表", "todoList": ToDo.incomplete.all()})
自定義方法(高優(yōu)先級)
先自定義一個子類【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就不能用默認(rèn)的objects來調(diào)用
todolists = models.Manager()
# 實例化一個IncompleteTodoManager,結(jié)果集是未完成的事件數(shù)據(jù)
incomplete = IncompleteTodoManager()
high = HighPriorityManager()
調(diào)用方法【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()
調(diào)用方法【views.py】
# 輸出所有未完成的事件
def todoList(request):
return render(request, 'todoList.html', {"showType": "所有事件列表", "todoList": ToDo.objects.incomplete()})
# 輸出指定優(yōu)先級的事件
def todoList(request):
return render(request, 'todoList.html', {"showType": "所有事件列表", "todoList": ToDo.objects.high()})
通過QuerySet方法來實現(xiàn)
先自定義一個子類【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()
調(diào)用方法【views.py】
# 輸出指定優(yōu)先級的事件
def todoList(request):
return render(request, 'todoList.html', {"showType": "所有事件列表", "todoList": ToDo.objects.all().high().})
# 輸出所有未完成指定優(yōu)先級的事件
def todoList(request):
return render(request, 'todoList.html', {"showType": "所有事件列表", "todoList": ToDo.objects.all().high().incomplete()})
優(yōu)化QuerySet方法來實現(xiàn)的Manager,減少all()方法的調(diào)用
先自定義一個子類【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()
調(diào)用方法【views.py】
# 輸出指定優(yōu)先級的事件
def todoList(request):
return render(request, 'todoList.html', {"showType": "所有事件列表", "todoList": ToDo.objects).high().})
# 輸出所有未完成指定優(yōu)先級的事件
def todoList(request):
return render(request, 'todoList.html', {"showType": "所有事件列表", "todoList": ToDo.objects.high().incomplete()})