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>
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)
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()})
二、 重命名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()
1 def todoList(request): 2 return render(request, 'todoLIst.html', 3 {'showtype':'所有待做事项','todoList':ToDo.todoList.all()})
三、 调用常用的查询方法
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()
1 def todoList(request): 2 return render(request, 'todoLIst.html', 3 {'showtype': '所有待做事项', 'todoList': ToDo.incomplete.all()})
四、 给查询增加方法
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()
1 def todoList(request): 2 return render(request, 'todoLIst.html', 3 {'showtype': '所有待做事项', 'todoList': ToDo.objects.high()})
五、 给查询增加方法 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()
1 def todoList(request): 2 return render(request, 'todoLIst.html', 3 {'showtype': '所有待做事项', 4 'todoList': ToDo.objects.all().high().incomplete()})
六、 给查询增加方法 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()
1 def todoList(request): 2 return render(request, 'todoLIst.html', 3 {'showtype': '所有待做事项','todoList': ToDo.objects.incomplete()})

浙公网安备 33010602011771号