Django:模型的定义

一,定义模型

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



你可能感兴趣的:(Web,python,web开发,django)