一,定义模型
1,ORM
对象关系映射--Object Relational Mapping,简称ORM。
Django 的对象关系映射器 (ORM) 位于框架的中心,介于数据模型(在 django.db.models.Model 类之上构建的 Python 类)和基础关系数据库对象之间。
简单来说,Django的ORM机制就是把底层的关系数据库和Python的面向对象特质联系起来。模型类映射数据表,对模型的操作直接反映到底层的数据表,即类代表了表,对象代表了其中的每一行,而对象的属性则代表了列。所以定义数据模型之后,你将能够通过映射到基础数据库中的对象的 Python 对象,来创建、检索、更新以及删除数据库数据。
Django的ORM机制除了 支持PostgreSQL、MySQL 和 SQLite 之外, 还正式支持 Oracle 数据库。
2,常用的模型数据类型
CharField和TextField:两个类型基本一样,都是保存文本。区别是CharFiled保存的是定长文本,TextField保存的则是变长文本;
EmailField、URLField和IPAddressField:这三个变量是都是在CharField基础上夹了额外的验证,分别对邮件的验证、URL的验证和对IP地址的验证;
BooleanField和NullBooleanField:BooleanField适用在存储True或False的场景。而有时候会出现不知道要存储哪个变量值的时候,可以选择NullBooleanField;
(更具体的信息可以参考官网文档:https://docs.djangoproject.com/en/1.6/ref/models/fields/#field-types)
基本的Django模型定义示例:
from django.db import models class Book(models.Mode): title = models.CharField(max_length = 100) author = models.ForeignKey(Author) length = models.IntegerField()
示例解释:
创建一个Book模型,当执行 “python manage.py syncdb”后会创建数据表Book,里面分别有字段titel(类型为字符)、author(外键)和length(整形)。
3,主键和唯一性
在Django中,如果模型中没有显式定义主键变量,会被自动指定一个id属性,类型为AutoField(一个自增的整数)。如果希望有更多的控制主键,只需在模型的某个变量上指定primary_key=True,此变量就会取代id属性成为该表的主键。
4,模型之间的关系
(1)外键
在Django外键表示称一个Field的子类ForeignKey,其主要参数是它要引用的模型类。
示例:
class Author(models.Model): name = models.CharField(max_length=100) class Book(models.Model): title = models.CharField(max_length = 100) author = models.ForeignKey(Author) #定义外键
注意:请把要引用的类定义在前面(如上),否则Author变量名无法在Book类中的models.ForeignKey() 使用。如果类不是在同一个文件里定义的,那就需要用到点记号(例如:myapp.Author)。如果想引用定义在后面的类作为外键,可以使用字符串代替类名,示例如下:
class Book(models.Model): title = models.CharField(max_length = 100) author = models.ForeignKey("Author") class Author(models.Model): name = models.CharField(max_length = 100)
使用Book和Author示例:
#查询title是"Moby Dick"的对象 book = Book.objects.get(title = "Moby Dick") #获取书的作者名字 author = Book.author #Get a set of the books the author has been credited on books = author.book_set.all()
(2)多对多关系
外键通常表示一对多或者多对一的关系。按照上面的例子,如果一本书关系又多个作者协同编写,一个作者也可以出版多本书,那就形成了Book和Author 的多对多关系。Django提供了"ManyToManyField"关系映射变量实现多对多的关系。ManyToManyField机制是在背后建立一张隐藏的表类来完成查询。
示例:
class Author(models.Model): name = models.CharField(max_length = 100) class Book(models.Model): title = models.CharField(max_length = 100) author = models.ManyToManyField(Author) #实现多对多关系
(3)一对一关系
Django提供OneToOneField实现一对一的关系。这种关系最常用来支持对象组合或拥有关系。
(4)限制关系
ForgeignKey和ManyToManyField可以指定一个limit_choices_to参数来限制关系,该参数接受一个字典。
示例:
下面的Book模型类只能和姓Simth的Author类一起工作
class Author(models.Model): name = models.CharField(max_length=100) class SimitBook(models.Model): title = models.CharField(max_length = 100) author = models.MangToMangField(Author,limit_choices_to={'name_endswith':'Smith'})
(4)模型继承
在Django的ORM里,两个模型类之间除了外键以及其他关系外,还可以和普通的、非ORM的Python类一样通过另一个模型继承来定义。目前,支持两种不同的继承方式:抽象基础类和多表继承。
抽象基础类
抽象基础类简单来说,就是纯Python继承,允许重构Python模型的定义。
示例:
使用抽象基础类重新组织Book和SmithBook的模型层次
class Author(models.Model): name = models.CharField(max_lenth=100) class Book(models.Model): title = models.CharField(max_length=100) genre = models.CharField(max_length = 100) num_page = models.IntegerField() authors = models.ManyToManyField(Author) def __unicode__(self): return self.title class Meta: abstract = True #设置True,指明是抽象基础类 class SmthBook(Book): #继承Book类 author = models.ManyToManyField(Author,limit_choices_to={'name_endswith':'Smith'})
注意:在Book的嵌套类Meta里的abstract设置为True,指明Book为抽象基础类。
多表继承
对表继承其实是对普通的“has-a”关系的一个包装,它和抽象基础类差别不大,依然用到Python的类继承,但不需要abstract=True这个Meta类选项。多表继承与抽象类的区别在于底层的机制,父类拥有自己完整的Django模型,可以正常实例化,同时能被子类继承,这是通过机制自动在子类和父类之间设置一个OneToOneField,还有其他一些机制把两个对象连在一起实现。但通常把上面提到的“has-a”关系隐藏起来,可以通过OnToOneField使其显示出来,它会给父类名字的小写形式加上一个_ptr后缀。
示例:
class Author(models.Model): name = models.CharField(max_length=100) class Book(models.Mode): title = models.CharField(max_length=100) genre = models.CharField(max_length=100) num_page = models.IntegerField() authors = models.ManyToManyField(Author) #多对多关系 def __unicode__(self): return self.title class SmithBook(Book): #继承Book author = models.ManyToManyField(Author,limit_choices_to={'name_endswith':'Smith'})
解释:这里没有Meta类的abstract选项。SmithBook的实例会得到book_ptr属性并指向它们组合的Book的实例,而属于SimitBook的Book实例会得到一个smithbook(没有_ptr后缀)属性。
(5)Meta嵌套类
Meta嵌套类处理关于模型的各种元数据的使用和显示:例如在一个对象对多个对象时,它的名字如何显示;在查询数据表时默认的排序是什么等等;
示例:
给Book类添加一点元数据
class Book(models.Model): title = models.CharField(max_length = 100) author = models.ManyToManyField(Author) class Meta: ordering = ['title']
(下一章记录如何使用模型)
参考:
1,《Django Web开发指南》
2,互动百科中ORM的介绍:http://www.baike.com/wiki/ORM
3,犹大的博客:http://blog.chinaunix.net/uid-608135-id-3764851.html
4,Django的模型数据类型(Django官网):
https://docs.djangoproject.com/en/1.6/ref/models/fields/#field-types
https://docs.djangoproject.com/en/1.6/ref/models/fields/#field-types