Django深入学习之模型语法(model syntax)

模型是你的网站数据信息惟一的、明确的来源。它包含你所储存数据的字段定义和行为。一般地,一个模型映射着一个惟一数据库的表单(table)。

  • 所有模型都是django.db.models.Model的子类。
  • 模型的每个属性代表着一个数据库字段
  • django会自动生成你所需要的数据库

使用模型

当你定义完你的数据模型,你得告诉Django你将使用它,你需要在setting.py中的INSTALLED_APPS中添加模型。

字段

一个模型最重要也是必须的部分 - 定义一系列的数据字段,字段由类属性来描述。注意字段名不要与模型API的一些关键字冲突,比如clean,save和delete。

字段选项

每一个字段都需要特定的字段说明选项来配套。比如CharField需要max_length来指明需要多大的空间来储存该字段。

null

如果True,Django将会在数据库中储存Null空值。默认是False。

blank

如果为真,这个字段允许为空,默认为False。

注意:blank与null的区别,null是数据库相关,而blank是数据合法性相关,如果一个字段有blank=True,表单将允许一个空值的条目,如果一个字段拥有blank=False,这个字段必须存在。

choices

一个可迭代的2个元组作为字段选项。如果存在这样的字段,默认表单窗口部件为选项枢。

例:

 

from django.db import models

class Person(models.Model):
    SHIRT_SIZES = (
        ('S', 'Small'),
        ('M', 'Medium'),
        ('L', 'Large'),
    )
    name = models.CharField(max_length=60)
    shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)

 

default

字段的默认值,这可以一个值,也可以是一个可以调用的对象,比如datetime.datetime.now()。

help_text

额外“help"文本以表单部件形式显示。

primary_key

如果为True,这个字段就是这个模型的主键。如果没有特别指明主键,那么Django会自动添加一个一个IntegerField作为主键。

unique

如果为True,那么这个字段在整个表单必须惟一。

 

详细字段名称

除了ForeinghKey,ManyToManyField和OneToOneField,每个字段类型都可以将详细字段名称作为第一个参数。如果没有特别指明详细字段名称,Django将会会用字段名称自动创建它。

如果是ForeinghKey,ManyToManyField和OneToOneField,那么需要使用verbose_name作为关键字来指定详细字段名称。

 

关系

很明显,关系数据库的优势基于互相相关的数据库表单。Django提供三种常见的数据关系。多对一(many-to-one)、多对多(many-to-many)、一对一(one-to-one)。

多对一(many-to-one)

要定义一个多对一关系,使用django.db.models.ForeignKey。ForeignKey需要一个位置参数:与此模型相关的类。

多对多(many-to-many)

要定义一个多对多关系,使用ManyToManyField。ManyToManyField同样需要一个位置参数:与此模型相关的类。

一对一(one-to-one)

要定义一个一对一关系,使用OneToOne。OneToOneField同样需要一个位置参数:与此模型相关的类。

跨文件模型

模型中的字段也可以与另一个应用中的模型存在外键关系。

字段名称限制

  • 字段名称不能是一个Python保留字段
  • 字段名称在一行里不能有超过一个下划线

 

元数据选项(Meta options)

模型的元数据通过使用内联类Meta来添加,模型的元数据是那些模型中除了字段的语句。比如排序选项(ordering),数据库表单名称(db_table)等等。

 

模型属性

一个模型最重要的属性是Manager,它是Django模型提供的数据库查询接口,用来从数据库获取对象。如果没有定义定制的Manager,那么它的默认名称是objects。

 

模型方法

有两个几乎所有模型类都会乃至的方法。

__str__()(Python3)

__unicode__()(python2)

当你在交互终端或者admin界面时,上面两个方法特别有用,它们定义了,在交互终端或者admin界面模型实例如何显示的问题。

get_absolute_url()

这个方法告诉Django如何为对象计算URL。

 

重写预定义的模型方法

还有其它一系列封装数据库行为的模型方法,有时候需要定制。特别是常见的save()和delete()

我们能够自由定制这些模型方法。

 

模型类的继承

模型类的继承与普通的Python类的继承并没有什么两样。

在Django中存在3种类型的继承:

1、抽象基类

2、多表单继承

3、代理继承

 

posted @ 2015-04-07 09:39  tmyyss  阅读(387)  评论(0编辑  收藏  举报