Django项目实践3 - Django模型(字段、数据库操作及模型继承)

http://blog.csdn.net/pipisorry/article/details/45725953

Django数据库字段类型(Field types)

AutoField

class  AutoField( **options)

它是一个根据 ID 自增长的 IntegerField 字段。通常,你不必直接使用该字段。如果你没在别的字段上指定主键,Django 就会自动添加主键字段。详见 自增主键字段(Automatic primary key fields)

BooleanField

class  BooleanField( **options)

一个布尔值(true/false)字段。Django 的管理后台用checkbox来表现该字段类型。

MySQL 用户请注意:

布尔字段在 MySQL 中被存储为 TINYINT 列。它的值只能是 0 或 1 (其他大多数据库都有适用的 BOOLEAN 类型)。所以仅在使用 MySQL 的情况下,从数据库中检索 BooleanField 并保存为 model 的属性,这时属性值是 1 或是 0 ,而不是 True 或 False 。正常情况下,这不会引起问题,因为 Python 保证令 1 == True 和 0 == False 都是有效的。只是在你编写类似 obj isTrue 语句时,如果 obj 正是 model 的一个布尔属性值,那你就要留心注意了。因为在使用 mysql 数据库时,"is" 操作是无效的。在这种场合下,使用相等判断更好(使用 "==")。

CharField

class  CharField( max_length=None [**options ])
它是一个字符串字段,对小字符串和大字符串都适用。对于更大的文本,应该使用  TextField 。

Django 的管理后台用  type="text"> (单行输入框) 来表示这种字段。

CharField 有一个必须传入的参数,字段的最大字符数。它作用于数据库层级和 Django 的数据验证层级。

注意:如果你正在编写的应用要求满足多种数据库,那么你就要注意不同数据库对 max_length 有不同的限制。详见 数据库 (database backend notes) 。

MySQL 用户请注意:

如果你使用 MySQLdb 1.2.2 和 utf8_bin 字符集(非默认设置),有几点注意事项要格外留意。详见 MySQL 数据库 (MySQL database notes) 。

CommaSeparatedIntegerField

class  CommaSeparatedIntegerField( max_length=None [**options ])

它用来存放以逗号间隔的整数序列。和 CharField 一样,必须为它提供 max_length 参数。而且要注意不同数据库对 max_length 的限制。

时间字段

DateTimeField和DateField和TimeField存储的内容分别对应着datetime(),date(),time()三个对象。
auto_now=Ture,字段保存时会自动保存当前时间,但要注意每次对其实例执行save()的时候都会将当前时间保存,也就是不能再手动给它存非当前时间的值。
auto_now_add=True,字段在实例第一次保存的时候会保存当前时间,不管你在这里是否对其赋值。但是之后的save()是可以手动赋值的。也就是新实例化一个model,想手动存其他时间,就需要对该实例save()之后赋值然后再save()。

Note:两者默认值都为False。

Django自动添加当前日期时间到数据库

models.DateTimeField(auto_now_add=True)
DateField
class  DateField( [ auto_now=Falseauto_now_add=False**options ])

该字段利用 Python 的 datetime.date 实例来表示日期。下面是它额外的可选参数:

DateField. auto_now
每一次保存对象时,Django 都会自动将该字段的值设置为当前时间。一般用来表示  "最后修改" 时间。要注意使用的是 当前日期,而并非默认值,所以你不能通过重写默认值的办法来改变保存时间。
DateField. auto_now_add
在第一次创建对象时,Django 自动将该字段的值设置为当前时间,一般用来表示对象创建时间。它使用的同样是 当前日期,而非默认值。

Django 管理后台使用一个带有 Javascript 日历的  type="text"> 来表示该字段,它带有一个当前日期的快捷选择。那个 JavaScript 日历总是以星期天做为一个星期的第一天。

DateTimeField

class  DateTimeField( [ auto_now=Falseauto_now_add=False**options ])

该字段利用 datetime.datetime 实例表示日期和时间。该字段所按受的参数和 DateField 一样。

Django 的管理后台使用两个  type="text"> 分别表示日期和时间,同样也带有 JavaScript 快捷选项。

TimeField

class  TimeField( [ auto_now=Falseauto_now_add=False**options ])

该字段使用 Python 的 datetime.time 实例来表示时间。它和 DateField 接受同样的自动填充的参数。Django 管理后台使用一个带 Javascript 快捷链接 的  type="text"> 表示该字段。

DurationField

New in Django 1.8.

DecimalField

这部分是在 Django 1.0 中新增的:  请查看版本文档
class  DecimalField( max_digits=Nonedecimal_places=None [**options ])

它是使用 Decimal 实例表示固定精度的十进制数的字段。它有两个必须的参数:

DecimalField. max_digits
数字允许的最大位数
DecimalField. decimal_places
小数的最大位数

例如,要存储的数字最大值是999,而带有两个小数位,你可以使用:

models.DecimalField(..., max_digits=5, decimal_places=2)

要存储大约是十亿级且带有10个小数位的数字,就这样写:

models.DecimalField(..., max_digits=19, decimal_places=10)

Django 管理后台使用  type="text"> (单行输入框) 表示该字段。

EmailField

class  EmailField( [ max_length=75**options ]),它是带有 email 合法性检测的A  CharField 。

FileField

class  FileField( upload_to=None [max_length=100**options ])

文件上传字段

注意:该字段不支持 primary_key 和 unique 参数,否则会抛出 TypeError 异常。

它有一个必须的参数:FileField.upload_to

用于保存文件的本地文件系统。它根据 MEDIA_ROOT 设置确定该文件的 url 属性。

该路径可以包含 时间格式串 (strftime formatting),可以在上传文件的时候替换成当时日期/时间(这样,就不会出现在上传文件把某个目录塞满的情况了)。

在 Django 1.0 已改动:  请查看版本文档

该参数也可以是一个可调用项,比如是一个函式,可以调用函式获得包含文件名的上传路径。这个可调用项必须要接受两个参数,并且返回一个保存文件用的 Unix-Style 的路径(用 / 斜杠)。两个参数分别是:

参数 描述
instance

定义了当前 FileField 的 model 实例。更准确地说,就是以该文件为附件的 model 实例。

大多数情况下,在保存该文件时, model 实例对象还并没有保存到数据库,这是因为它很有可能使用默认的 AutoField,而此时它还没有从数据库中获得主键值。(用法见oteam的http://oteam.cn/2008/10/4/dynamic-upload-paths-in-django/)

filename 上传文件的原始名称。在生成最终路径的时候,有可能会用到它。

还有一个可选的参数:

FileField. storage
这部分是在 Django 1.0 中新增的:  请查看版本文档

负责保存和获取文件的对象。详见 Managing files

Django 管理后台使用  type="file"> (一个文件上传的部件) 来表示这个对象。

在 model 中使用 FileField 或 ImageField (稍后提到) 要按照以下的步骤:

  1. 在项目配置文件中,你要定义 MEDIA_ROOT ,将它的值设为用来存放上传文件的目录的完整路径。(基于性能的考虑,Django 没有将文件保存在数据库中。) ,然后定义 MEDIA_URL ,将它的值设为表示该目录的网址。要确保 web 服务器所用的帐号拥有对该目录的写权限。
  2. 在 model 里面添加 FileField 或 ImageField ,并且确认已定义了 upload_to 项,让 Django 知道应该用 MEDIA_ROOT 的哪个子目录来保存文件。
  3. 存储在数据库当中的仅仅只是文件的路径(而且是相对于 MEDIA_ROOT 的相对路径)。你可能已经想到利用 Django 提供的 url 这个方便的函式。举个例子,如果你的 ImageField 名称是mug_shot,那么你可以在模板中使用 {{ object.mug_shot.url }} ,就能得到图片的完整网址。

例如,假设你的 MEDIA_ROOT 被设为 '/home/media'upload_to 被设为 'photos/%Y/%m/%d'。 upload_to 中的 '%Y/%m/%d' 是一个 时间格式字符串 (strftime formatting); '%Y' 是四位的年分,'%m' 是两位的月分, '%d' 是两位的日子。如果你在2007年01月15号上传了一个文件,那么这个文件就保存在 /home/media/photos/2007/01/15 目录下。

如果你想得到上传文件的本地文件名称,文件网址,或是文件的大小,你可以使用 nameurl 和 size 属性;详见 管理文件 (Managing files)

注意:在上传文件时,要警惕保存文件的位置和文件的类型,这么做的原因是为了避免安全漏洞。对每一个上传文件都要验证,这样你才能确保上传的文件是你想要的文件。举个例子,如果你盲目地让别人上传文件,而没有对上传文件进行验证,如果保存文件的目录处于 web 服务器的根目录下,万一有人上传了一个 CGI 或是 PHP 脚本,然后通过访问脚本网址来运行上传的脚本,那可就太危险了。千万不要让这样的事情发生!

这部分是在 Django 1.0 中新增的: 在这个版本中,新加了  max_length 参数。

默认情况下,FileField 实例在数据库中的对应列是 varchar(100) ,和其他字段一样,你可以利用 max_length 参数改变字段的最大长度。

FilePathField

class  FilePathField( path=None [match=Nonerecursive=Falsemax_length=100**options ]) ¶

它是一个 CharField ,它用来选择文件系统下某个目录里面的某些文件。它有三个专有的参数,只有第一个参数是必须的:

FilePathField. path
这个参数是必需的。它是一个目录的绝对路径,而这个目录就是  FilePathField 用来选择文件的那个目录。比如:  "/home/images".
FilePathField. match
可选参数。它是一个正则表达式字符串,  FilePathField 用它来过滤文件名称,只有符合条件的文件才出现在文件选择列表中。要注意正则表达式只匹配文件名,而不是匹配文件路径。例如:  "foo.*\.txt$" 只匹配名为  foo23.txt 而不匹配  bar.txt 和  foo23.gif
FilePathField. recursive
可选参数。它的值是  True 或  False。默认值是  False。它指定是否包含  path 下的子目录。

当然,这三个参数可以同时使用。

前面已经提到了 match 只匹配文件名称,而不是文件路径。所以下面这个例子:

FilePathField(path="/home/images", match="foo.*", recursive=True)

将匹配 /home/images/foo.gif ,而不匹配 /home/images/foo/bar.gif。这是因为 match 只匹配文件名 (foo.gif 和 bar.gif).

这部分是在 Django 1.0 中新增的: 在这个版本中,新加了  max_length 参数。

默认情况下, FilePathField 实例在数据库中的对应列是s varchar(100) 。和其他字段一样,你可以利用 max_length 参数改变字段的最大升序。

FloatField

class  FloatField( [ **options ]) ¶

在 Django 1.0 在已改动:  请查看版本文档

该字段在 Python 中使用by a float 实例来表示一个浮点数。

Django 管理后台用  type="text"> (一个单行输入框) 表示该字段。

ImageField

class  ImageField( upload_to=None [height_field=Nonewidth_field=Nonemax_length=100**options ])

和 FileField 一样,只是会验证上传对象是不是一个合法的图象文件。它有两个可选参数:

ImageField. height_field:保存图片高度的字段名称。在保存对象时,会根据该字段设定的高度,对图片文件进行缩放转换。
ImageField. width_field:保存图片宽度的字段名称。在保存对象时,会根据该字段设定的宽度,对图片文件进行缩放转换。

除了那些在 FileField 中有效的参数之外, ImageField 还可以使用 File.height and File.width 两个属性。详见管理文件 (Managing files)(但并没有找到这两个参数的介绍)。使用该字段要求安装 Python Imaging Library(PIL).

这部分是在 Django 1.0 中新增的: 在新版本中新加了 max_length 参数。默认情况下, ImageField 实例对应着数据库中的 created as varchar(100) 列。和其他字段一样,你可以使用 max_length 参数来改变字段的最大长度。

IntegerField

class  IntegerField( [ **options ])

整数字段。Django 管理后台用  type="text"> (一个单行输入框) 表示该字段。

IPAddressField

class  IPAddressField( [ **options ])

以字符串形式(比如 192.0.2.30)表示 IP 地址字段。Django 管理后台使用  type="text"> (一个单行输入框) 表示该字段。

NullBooleanField

class  NullBooleanField( [ **options ])

与 BooleanField 相似,但多了一个 NULL 选项。建议用该字段代替使用 null=True 选项的 BooleanField 。Django 管理后台使用