Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
Django默认会为每个Django模型类添加一个Manager ,命名为objects。使用自定义的 Manager 对象,需要注意,Django遇到的第一个Manager(以它在模型中被定义的位置为准)会有一个特殊状态。Django将会把第一个Manager 定义为默认Manager ,Django的许多部分(但是不包括admin应用)将会明确地为模型使用这个manager。结论是,应该小心地选择默认manager。因为覆盖get_query_set() 了,可能接受到一个无用的返回对像,必须避免这种情况。
Manager,QuerySet,Model是django的ORM用到的三个类。
修改初始Manager QuerySets
manager的基本QuerySet返回系统中的所有对象。例如,`` Book.objects.all()`` 返回数据库book中的所有书本。
可以通过覆盖Manager.get_query_set()方法来重写manager的基本QuerySet。get_query_set()按照自定义的要求返回一个QuerySet。
例如,下面的模型有两个manager。一个返回所有对像,另一个只返回作者是Roald Yun的书。
from django.db import models
# First, define the Manager subclass.
class YunBookManager(models.Manager):
def get_query_set(self):
return super(YunBookManager, self).get_query_set().filter(author='Roald Yun')
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=50)
# ...
objects = models.Manager() # The default manager.
yun_objects = YunBookManager() # The Dahl-specific manager.
在这个示例模型中,Book.objects.all()返回了数据库中的所有书本,而Book.yun_objects.all()只返回了一本. 注意已经明确地将objects设置成manager的实例,因为如果不这么做,那么唯一可用的manager就将是 yun_objects。
当然,由于get_query_set()返回的是一个QuerySet对象,所以可以使用filter(),exclude()和其它一切QuerySet的方法。 像这些语法都是正确的:
Book.yun_objects.all()
Book.yun_objects.filter(title='Matilda')
Book.yun_objects.count()