Django 进阶 之 自定义manager

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

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Django进阶</title>
 6 </head>
 7 <body>
 8 <p>{{ showType }}</p>
 9 <div>
10     {% for todoItem in todoList %}
11     <p>{{ todoItem.content }} {{ todoItem.is_done }} {{ todoItem.priority }}</p>
12     {% endfor %}
13 </div>
14 </body>
15 </html>
/templates/todoList.html
1 from django.conf.urls import url
2 from django.contrib import admin
3 from polls import views
4 
5 urlpatterns = [
6     url(r'^admin/', admin.site.urls),   
7     url(r'^todoList/$', views.todoList),
8 ]

 

一、 Manager的常见用法

1 class ToDo(models.Model):
2     content = models.CharField(max_length=200)
3     is_done = models.BooleanField(default=False)
4     priority = models.IntegerField(default=1)
5 
6     def __str__(self):
7         return '%s - %d' %(self.content, self.priority)
/polls/views.py
1 from django.shortcuts import render
2 from polls.models import ToDo
3 
4 def todoList(request):
5     return render(request, 'todoLIst.html',
6                   {'showtype':'所有待做事项','todoList':ToDo.objects.all()})
/polls/views.py

 

二、 重命名model的Manger

 1 class ToDo(models.Model):
 2     content = models.CharField(max_length=200)
 3     is_done = models.BooleanField(default=False)
 4     priority = models.IntegerField(default=1)
 5 
 6     def __str__(self):
 7         return '%s - %d' %(self.content, self.priority)
 8 
 9     # 把model的manager重命名为todoList,
10     # 在使用时就不能使用ToDo.objects了,需要使用ToDo.todoList
11     todoList = models.Manager()
/polls/models.py
1 def todoList(request):
2     return render(request, 'todoLIst.html',
3                   {'showtype':'所有待做事项','todoList':ToDo.todoList.all()})
/polls/views.py

 

三、 调用常用的查询方法

 1 class IncompleteTodoManager(models.Manager):
 2     def get_queryset(self):
 3         return super(IncompleteTodoManager, self).get_queryset().filter(is_done=False)
 4 
 5 class ToDo(models.Model):
 6     content = models.CharField(max_length=200)
 7     is_done = models.BooleanField(default=False)
 8     priority = models.IntegerField(default=1)
 9 
10     def __str__(self):
11         return '%s - %d' %(self.content, self.priority)
12 
13     #实例化一个IncompleteTodoManager对象incomplete
14     incomplete = IncompleteTodoManager()
/polls/models.py
1 def todoList(request):
2     return render(request, 'todoLIst.html',
3                   {'showtype': '所有待做事项', 'todoList': ToDo.incomplete.all()})
/polles/views.py

 

四、 给查询增加方法

 1 class ToDoManager(models.Manager):
 2     def incomplete(self):
 3         return self.filter(is_done=False)
 4 
 5     def high(self):
 6         return self.filter(priority=1)
 7 
 8 class ToDo(models.Model):
 9     content = models.CharField(max_length=200)
10     is_done = models.BooleanField(default=False)
11     priority = models.IntegerField(default=1)
12 
13     def __str__(self):
14         return '%s - %d' %(self.content, self.priority)
15 
16     objects = ToDoManager()
/polls/models.py
1 def todoList(request):
2     return render(request, 'todoLIst.html',
3                   {'showtype': '所有待做事项', 'todoList': ToDo.objects.high()})
/polls/views.py

 

五、 给查询增加方法 2

 1 class ToDoQuerySet(models.QuerySet):
 2     def incomplete(self):
 3         return self.filter(is_done=False)
 4 
 5     def high(self):
 6         return self.filter(priority=1)
 7 
 8 class NewToDoManager(models.Manager):
 9     def get_queryset(self):
10         return ToDoQuerySet(self.model, using=self._db)
11 
12 class ToDo(models.Model):
13     content = models.CharField(max_length=200)
14     is_done = models.BooleanField(default=False)
15     priority = models.IntegerField(default=1)
16 
17     def __str__(self):
18         return '%s - %d' %(self.content, self.priority)
19 
20     objects = NewToDoManager()
/polls/models.py
1 def todoList(request):
2     return render(request, 'todoLIst.html',
3                   {'showtype': '所有待做事项',
4                    'todoList': ToDo.objects.all().high().incomplete()})
/polls/views.py

 

六、 给查询增加方法 3

 1 class ToDoQuerySet(models.QuerySet):
 2     def incomplete(self):
 3         return self.filter(is_done=False)
 4 
 5     def high(self):
 6         return self.filter(priority=1)
 7 
 8 class NewToDoManager(models.Manager):
 9     def get_queryset(self):
10         return ToDoQuerySet(self.model, using=self._db)
11 
12     def incomplete(self):
13         return self.get_queryset().incomplete()
14 
15     def high(self):
16         return self.get_queryset().high()
17 
18 class ToDo(models.Model):
19     content = models.CharField(max_length=200)
20     is_done = models.BooleanField(default=False)
21     priority = models.IntegerField(default=1)
22 
23     def __str__(self):
24         return '%s - %d' %(self.content, self.priority)
25 
26     objects = NewToDoManager()
/polls/models.py
1 def todoList(request):
2     return render(request, 'todoLIst.html',
3                   {'showtype': '所有待做事项','todoList': ToDo.objects.incomplete()})
/polls/views.py

 

posted @ 2017-05-29 20:25  taibai  阅读(99)  评论(0)    收藏  举报