Djangp学习之模型

 django.db.models.Model

字段

 

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()

字段类型

     AutoField 

指一个能够根据可用 ID 自增的 IntegerField 。通常你不用直接使用它,如果你没有指定主键的话,系统会自动在你的模型中加入这样的主键。 

    BooleanField 

一个真/假(true/false)字段。 

  CharField 

一个字符串字段,适用于中小长度的字符串。对于长段的文字,请使用 TextField 。 

CharField 有一个额外的必需参数: maxlength ,它是字段的最大长度(字符数)。这个最大长度在数据库层面和 Django 验证中是被强制要求的。 

CommaSeparatedIntegerField 

一个用逗号分隔开的整数字段。和 CharField 中一样, maxlength 参数是必需的。 

DateField 

日期字段。 DateField 有一些额外的可选参数,如表 B-1 所示。 

                auto_now 

每次对象保存时,自动设置为当前日期。一般用来产生最后一次修改时间。 注意:使用此选项的字段的值总是在保存时被设置为保存时的日期,这是无法改变的。 

                 auto_now_add 

当对象第一次产生时字段设置为当前日期。一般用来产生对象的建立时间。 注意:使用此选项的字段值总是在对象建立时被设置为建立时的日期,这是无法改变的。 

DateTimeField   

时间日期字段。接受跟 DateField 一样的额外选项。 

EmailField 

一个能检查值是否是有效的电子邮件地址的 CharField 。不接受 maxlength 参数,它的 maxlength 被自动设置为 75。 

FileField 

一个文件上传字段。它有一个 必需的 参数,如下所示。 

        upload_to 

一 个 本 地 的 文 件 系 统 路 径 , 被 附 加 到 你 的   MEDIA_ROOT  设 置 后 面 , 这 决 定 了 

        get_<fieldname>_url()  

辅助函数的输出 这个路径可以包含 strftime 格式串(参见 http://www.djangoproject.com/r/python/strftime/ ),文件上传时就会用当时的具体日期/时间替换(这样给定的目录就不会被上传的文件塞满了)。 

      在模型中使用 FileField 或者 ImageField 时,要有以下的步骤: 

1.  在 settings 文件中你需要定义 MEDIA_ROOT ,它就是你要保存上传文件的目录的全路径。(出于性能考虑,这些文件不会保存到数据库中。)还要定义 MEDIA_URL ,刚才那个目录的对外 URL。你要确保网络服务器使用的用户对这个目录是可写入的。 

2.  在模型中添加 FileField 或者 ImageField ,务必要定义 upload_to 选项,这样Django 才知道把上传的文件写到 MEDIA_ROOT 的哪个子目录中。 

3.  保存到数据库中的只有文件(相对于 MEDIA_ROOT )的路径。你很可能会使用 Django提供的 get_<fieldname>_url 函数。例如,如果你的 ImageField 叫做 mug_shot 的话,你在模板中使用 {{ object.get_mug_shot_url }} 就会得到图片的绝对 URL 了。 

例如,你的 MEDIA_ROOT 设置为 '/home/media' , upload_to 设置为 'photos/%Y/%m/%d' 。

    其中 '%Y/%m/%d' 部分是日期格式化串: '%Y' 为 4 位的年份, '%m' 是两位月份, '%d' 是两位的日期。如果你在 2007 年 1 月 15 日上传文件,这个文件就会被保存在 /home/media/photos/2007/01/15 目录下。 如果你想得到上传文件在磁盘上的文件名,或者指向该文件的 URL,或者文件大小,你可以分别使用这些方法: get_FIELD_filename() 、 get_FIELD_url() 和 get_FIELD_size() 。

    处理上传的文件时,为了避免安全漏洞,你应该总是密切注意上传文件的位置,以及文件的类型。 验证所有上传文件 ,确保文件内容是你所期望的。 

     例如,你未加验证地盲目的让某人上传文件,恰恰又上传到了网页服务器的根目录下的某个目录中,这个人就可以通过上传一个 CGI 或者 PHP 脚本并访问对应链接来执行那个脚本。不要让这种情况发生。 

FilePathField 

一个拥有若干可选项的字段,选项被限定为文件系统中某个目录下的文件名。它有 3 个特殊

的参数,FilePathField 的额外选项参数 描述 

       path 

    必需 ;文件系统中一个目录的绝对路径,  FilePathField  将从那个目录得到选项列表(比如: "/home/images"  )。 

       match 

可选;一个正则表达式字符串,  FilePathField  用它来过滤文件名。注意,这个正则表达式只作用 于基文件名,而不是全路径(例如:  "foo.*\.txt^"  会匹配  foo23.txt  ,但是不会匹配  bar.txt  或者  foo23.gif  )。 

       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 )。 

FloatField 

一个浮点数,对应 Python 中的 float 实例。它有两个 必需的参数 

                          max_digits  数字中允许的最大的数字位数 

                         decimal_places 数字的小数位数 

例如,要保存最大值为 999 并且有两位小数的数字,应该这样写:

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

要保存最大值为 10 亿并且带 10 个小数位的数字,要这样写: 

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

ImageField 

像 FileField 一样,只不过要验证上传的对象是一个有效的图片。它有两个额外的可选参数: 

             height_field 和 width_field ,如果设置了的话,每当模型实例被保存的时候,这两个值就会被设置成图片的高度和宽度。 

               FileField 中有一系列的 get_FIELD_* 方法,作为一种补充, ImageField 提供了 get_FIELD_height() 和 get_FIELD_width() 方法。

               ImageField 依赖 Python 图片库( http://www.pythonware.com/products/pil/ )。 

IntegerField 

一个整数。 

IPAddressField 

一个 IP 地址,以字符串格式表示(例如: "24.124.1.30" )。 

NullBooleanField 

就像一个 BooleanField ,但它支持 None /Null 。尽量使用这个,而不要使用设置了。    null=True 的 BooleanField 。 

PhoneNumberField 

它是一个 CharField ,并且会检查值是否是一个合法的美式电话格式,如(XXX-XXX-XXXX)。 

如果你需要表示一个其他国家的电话号码,检查 django.contrib.localflavor 包,看看是否包括对应你的国家的字段定义。 

PositiveIntegerField 

和 IntegerField 类似,但必须是正值。 

PositiveSmallIntegerField 

与 PositiveIntegerField 类似,但只允许小于一定值的值。最大值取决于数据库,但因为数据库有一个 2-byte 的小整数字段,最大的小整数正值一般都是 65,535。 

SlugField 

嵌条是报纸业的术语。 

嵌条就是一段内容的简短标签,这段内容只能包含字母、数字、下划线或连字符。通常用于 URL 中。 像 CharField 一样,你可以指定 maxlength 。如果没有指定 maxlength ,Django 将使用默认值 50。 由于嵌条主要用于数据库查找,所以 SlugField 默认的就有 db_index=True 。 SlugField 接受一个额外的选项: prepopulate_from ,它是一些字段的列表,而这些字段

将在对象管理表单中通过 JavaScript 生成嵌条。 

             models.SlugField(prepopulate_fpom=("pre_name", "name")) 

                prepopulate_from 不接受 DateTimeField 字段的名字作为参数。 

SmallIntegerField 

和 IntegerField 类似,但是只允许在一个数据库相关的范围内的数值(通常是-32,768 到+32,767)。 

TextField 

一个不限长度的文字字段。 

TimeField 

时分秒的时间显示。它接受的可指定参数与 DateField 和 DateTimeField 相同。 

URLField 

用来存储 URL 的字段。如果 verify_exists 选项被设置为 True (默认),给出的 URL 就会

被检测是否存在(例如:这个 URL 的确被加载并且没有给出一个 404 响应)。 和其他字符字段一样, URLField 接受 maxlength 参数。如果你没有指定 maxlength ,则使用默认值 200。 

USStateField 

美国州名称缩写,两个字母。  

如果你需要表示其他的国家或地区,查看一下 django.contrib.localflavor 包,看看 Django是否已经包含了对应你本地的字段。 

XMLField 

它就是一个 TextField ,只不过要检查值是匹配指定 schema 的合法 XML。它有一个必需参

数: schema_path ,它是验证字段合法性所需的 RELAX NG( http://www.relaxng.org/ )schema 的物理路径。 

要验证 XML 合法性需要用到 jing ( http://thaiopensource.com/relaxng/jing.html )工具。 

 

 

域选项

 

 

null 

如果设置为 True 的话,Django 将在数据库中存储空值为 NULL 。默认为 False 。 记住,空字符串值保存时总是以空字符串的形式存在,而不是 NULL 。一般只对非字符串字段使用 null=True ,比如整型、布尔型和日期型。对于这两种字段,如果你允许表单中的对应值为空的话,你还需要设定 blank=True ,因为 null 参数只影响数据库存储(参见下面题为 blank 的一节)。 如果没有充分理由的话,应该尽量避免对诸如 CharField 和 TextField 这样字符串字段使用 null 参数。如果对字符串字段指定了 null=True 的话,这意味着空数据有两种可能的值: NULL 和空字符串。而大多数情况下,空数据没必要对应两种可能的值,所以 Django 中习惯使用空字符串,而不是 NULL 。 

blank 

如果是 True ,该字段允许留空,默认为 False 。 

注意这与 null 不同, null 完全是数据相关的,而 blank 是用来做验证的。如果一个字段设置了 blank=True ,在 Django 的管理界面会允许该字段留空,如果设置了 blank=False ,那么这就是一个必填字段。 

choices 

一个包含双元素元组的可迭代的对象,用于给字段提供选项。 

如果指定了这个选项,Django 管理界面不会使用标准的文本框了,而是取而代之,使用列表选择框限定选择范围。 下面就是一个选项列表: 

YEAR_IN_SCHOOL_CHOICES = ( 

    ('FR', 'Freshman'), 

    ('SO', 'Sophomore'), 

    ('JR', 'Junior'), 

    ('SR', 'Senior'), 

    ('GR', 'Graduate'), 

每个元组中的第一个元素是实际存储的值,第二个元素是用于显示给用户的选项。 

选项列表既可以作为模型类的一部分来定义: 

class Foo(models.Model): 

    GENDER_CHOICES = ( 

        ('M', 'Male'), 

        ('F', 'Female'), 

    ) 

    gender = models.CharField(maxlength=1, choices=GENDER_CHOICES) 

也可以定义到模型类的外面: 

GENDER_CHOICES = ( 

    ('M', 'Male'), 

    ('F', 'Female'), 

class Foo(models.Model):   

    gender = models.CharField(maxlength=1, choices=GENDER_CHOICES) 

对于设定了 choices 选项的模型字段,Django 会添加一个方法,来获取字段当前值对应的用户可读文本。

db_column 

当前字段在数据库中对应的列的名字。如果没有指定的话,Django 会使用这个字段的名字。

当你要定义一个数据库中存在命名冲突的模型时,这个选项非常有用。 

如果你指定的数据库列名称是 SQL 的保留字,或者名称中包含 Python 变量名不允许的字符(就是连字符),没问题,Django 会悄悄地把列名或者表名用引号引起来。 

db_index 

如果为 True ,Django 会在创建表格(比如运行 manage.py syncdb )时对这一列创建数据库索引。 

default 

字段的默认值。 

editable 

如果为 False ,这个字段在管理界面或表单里将不能编辑。默认为 True 。 

help_text 

在管理界面表单对象里显示在字段下面的额外帮助文本。即使你没有管理表单这个属性对文档也是有用的。 

primary_key 

如果为 True ,这个字段就会成为模型的主键。 

如果你没有对模型中的任何字段指定 primary_key=True 的话,Django会自动添加这个字段: 

id = models.AutoField('ID', primary_key=True) 

所以,如果你不想覆盖默认的主键行为的话,你就不必对任何字段设定 primary_key=True 。    primary_key=True 就意味着 blank=False 、 null=False 和 unique=True 。一个对象只能有一个主键。 

radio_admin 

默认地,对于 ForeignKey 或者拥有 choices 设置的字段,Django 管理界面会使用列表选择框(<select>)。如果 radio_admin 设置为 True 的话,Django 就会使用单选按钮界面。 如果字段不是 ForeignKey 或者没有 choices 设置的话,就不要对字段只用这个选项。 

unique 

如果是 True ,这个字段的值在整个表中必须是唯一的。 

unique_for_date 

把它的值设成一个 DataField 或者 DateTimeField 的字段的名称,可以确保字段在这个日期内不会出现重复值,例如: 

class Story(models.Model): 

    pub_date = models.DateTimeField() 

    slug = models.SlugField(unique_for_date="pub_date") 

    ... 

在上面的代码中,Django 不会允许在同一个日期发表两个嵌条相同的故事。和使用 unique_together 不同的是,它只考虑 pub_date 字段的日期,而忽略掉时间差异。 

unique_for_month 

和 unique_for_date 类似,只是要求字段在指定字段的月份内唯一。 

unique_for_year 

和 unique_for_date 及 unique_for_month 类似,只是时间范围变成了一年。 

verbose_name 

除 ForeignKey 、 ManyToManyField 和 OneToOneField 之外的字段都接受一个详细名称作

为第一个位置参数。如果详细名称没有给定的话,Django 会把字段的属性名中的下划线转化

成空格后的字符串当作详细名称。  

一对多 多对多 一对一

下面的例子中,详细名称是 "Person's first name" : 

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

下面的例子中,详细名称是 "first name" : 

first_name = models.CharField(maxlength=30) 

ForeignKey 、 ManyToManyField 和 OneToOneField 要求第一个参数是一个模型类,所以只能使用关键字参数 verbose_name : 

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") 

这种转换不会把 verbose_name 的首字母大写,Django 会根据需求自动大写首字母。 

 

你可能感兴趣的:(django)