django模型1

模型

模型是数据独有的限定性源。它包括所存储数据的必要的字段及数据行为。总体上说,每个模型映射到唯一的一张数据库表上。

基本要点:

每个模型都是一个Python类,这个类是django.db.models.Model的子类。

模型类的每个属性代表了一个数据库字段。

通过以上所提到的两点,Django为我们提供了一整套自动生成的数据库存取API;查看执行查询(Making queries)。

例子:

这个例子定义了一个Person模型,它有first_name和last_name两个字段:

from django.db import models

 

class Person(models.Model):

    first_name = models.CharField(max_length=30)

last_name = models.CharField(max_length=30)

first_name和last_name是模型的两个字段。每个字段被指定为一个类属性,每个属性映射为一个数据库表的列。

上面的Person模型将会生成如下所示的数据库表:

CREATE TABLE myapp_person (

    "id" serial NOT NULL PRIMARY KEY,

    "first_name" varchar(30) NOT NULL,

    "last_name" varchar(30) NOT NULL

);

需要注意的一些知识点如下:

数据表的表名myapp_person是自动从模型元数据中衍生出来的,当然也可以自定义。查看表名以了解更多细节... …

字段id是自动添加的,当然这个特性也可以自定义。查看自动主键字段。

这个例子中的SQL命令CREATE TABLE采用的是PostgreSQL语法,需要指出的是,Django根据settings文件中指定的数据库后台来确定采用哪种一致的SQL语法。

使用模型

一旦完成了模型的定义,下一步就需要告诉Django要使用这些模型。要做到这一点,需要编辑settings文件,更改INSTALLED_APPS项,将包括models.py的模块名添加进去。

例如,假设mysite.myapp.models模块包含应用程序的模型(应用程序的包结构由脚本命令manage.py startapp生成),INSTALLED_APPS看起来就像这样(部分地):

INSTALLED_APPS = (

    #...

    'mysite.myapp',

    #...

)

在INSTALLED_APPS中添加新的应用程序之后,一定要确保运行manage.py syncdb命令。

 

字段

模型的最重要的部分,也即非可或缺的部分当属数据库中要定义的字段的列表。字段由类的属性指定。

例如:

class Musician(models.Model):

    first_name = models.CharField(max_length=50)

    last_name = models.CharField(max_length=50)

    instrument = models.CharField(max_length=100)

 

class Album(models.Model):

    artist = models.ForeignKey(Musician)

    name = models.CharField(max_length=100)

    release_date = models.DateField()

num_stars = models.IntegerField()

 

字段类型

模型中的每一个字段须是相应的字段类(Field class)的一个实例。Django的字段类(Field class)决定了:

数据库中列的类型(例如,INTEGER,VARCHAR)。

在Django的后台应用程序(admin)界面中要使用什么部件(例如,<input type=”text”>,<select>)。

在Django的后台应用程序(admin)以及自动生成的表单中的基本验证需求。

Django附带有十几种内建字段类型;你可以在模型字段参考中查看完整列表。如果内建字段类型无法满足需要,你可以很轻松地构建自己的字段类型;可以查看自定义模型字段一节。

 

字段选项

每一个字段都有一些相应的字段参数(相应文档可以查看模型字段参考)。例如,CharField(及其子类)使用max_length参数指定对应的用于保存数据的数据库字段VARCHAR的字段长度。

一些公共参数适用于所有的字段类型。它们都是可选的。它们的完整解释可以参考手册中找到,以下是一些最常使用的参数的大致介绍:

null

如果null的值为True,Django会以NULL在数据库保存空值。它的默认值为False。

blank

如果blank的值为True,相应数据库字段将允许值为空。它的默认值为False。

注意blank和null是有区别的。Null是纯粹的数据库相关的选项,而blank是验证相关的选项。如果一个字段设置了选项blank=True,在Django的admin应用程序中将允许该字段输入空值。如果一个字段设置了选项blank=False,该字段将为必填字段。

Choices

一个二元的可迭代值(列表或元组)可以作为一个字段的可选择项。如果设置了该选项,Django的admin应用程序将会以选择框取代标准的文本输入框,并且输入仅限于所定的选项。

一个choices列表看起来就像这样:

YEAR_IN_SCHOOL_CHOICES = (

    (u'FR', u'Freshman'),

    (u'SO', u'Sophomore'),

    (u'JR', u'Junior'),

    (u'SR', u'Senior'),

    (u'GR', u'Graduate'),

)

每一个元组中的第一个元素的值表示要在数据库中存储的值。第二个元素的值为在admin应用程序界面上显示的内容,或显示在模型选择字段(ModelChoiceField)中。对于一个模型对象的实例来说,choices字段的第二个元素的值可以通过get_FOO_display方法来获取。例如:

from django.db import models

 

class Person(models.Model):

    GENDER_CHOICES = (

        (u'M', u'Male'),

        (u'F', u'Female'),

    )

    name = models.CharField(max_length=60)

gender = models.CharField(max_length=2, choices=GENDER_CHOICES)

 

>>> p = Person(name="Fred Flinstone", gender="M")

>>> p.save()

>>> p.gender

u'M'

>>> p.get_gender_display()

u'Male'

 

default

表示字段的默认值。可以是值,也可以是可调用对象。如果默认值是可调用对象,那么每创建一个新实例,它都会被调用一次。

 

help_text

显示在admin表单下的相应字段的额外的“帮助”文本。即使对象没有使用admin表单,它对于文档清晰也是有帮助的。

 

primary_key

如果primary_key的值为True,该字段将是模型的主键。

如果在模型中你没有为任何一个字段指定primary_key=True,Django将自动添加一个IntegerField类型的字段用于主键,所以为字段设置primary_key=True选项不是必需的,除非你想覆盖掉默认行为。更多细节,请查看自动主键字段一节(Automatic primary key fields)。

 

unique

如果unique的值为True,这个字段的值在数据库表中须是唯一的。

 

再次重申,这些仅仅是常用字段选项的简单介绍。完整的描述可在查看通用模型字段选项参考(common model field option reference)。

 

自动主键字段(Automatic primary key fields)

默认地,Django为每一个模型提供了以下字段:

id = models.AutoField(primary_key=True)

这是一个值自动增加的主键。

如果你想指定一个自定义主键,仅需在相应字段中指定primary_key=True即可。如果Django看到你明确地指定了Field.primary_key,它将不再自动地添加id列。

每一个模型都需要且仅需要一个字段有primary_key=True这个选项。

 

详细字段名(Verbose field names)

每一个字段类型,除ForeignKey,ManyToManyField和OneToOneField之外,带有一个可选的处于最前面的位置参数--- ---详细名称。如果没有提供详细名称参数,Django将会采用字段的属性名,并且必要时转换下划线为空格。

下例中,详细名为“Person’s first name”:

first_name = models.CharField("Person's first name", max_length=30)

 

下例中,详细名为“first name”:

first_name = models.CharField(max_length=30)

 

ForeignKey,ManyToManyField和OneToOneField字段的第一个参考必须为一个模型类,所以它必须使用关键字参数:

poll = models.ForeignKey(Poll, verbose_name="the related poll")

sites = models.ManyToManyField(Site, verbose_name="list of sites")

place = models.OneToOneField(Place, verbose_name="related place")

按照惯例,详细字段名的第一个字母不必大写。Django将会在需要时自动转换大小写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值