Model 字段类型

Feild命名的限制

  Django 对字段的命名只有两个限制:

  1. 字段的名称不能是Python 保留的关键字,因为这将导致一个Python 语法错误。例如:

    class Example(models.Model):
        pass = models.IntegerField() # 'pass' is a reserved word!
    
  2. 由于Django 查询语法的工作方式,字段名称中连续的下划线不能超过一个。例如:

    class Example(models.Model):
        foo__bar = models.IntegerField() # 'foo__bar' has two underscores!
    

  这些限制有变通的方法,因为没有要求字段名称必须与数据库的列名匹配。参 见db_column 选项。


 

AutoField

  默认情况下,Django 会给每个模型添加下面这个字段:

  id = models.AutoField(primary_key=True)

  这是一个自增主键字段。

  如果你想指定一个自定义主键字段,只要在某个字段上指定 primary_key=True 即可。如果 Django 看到你显式地设置了 Field.primary_key,就不会自动添加 id 列。

  每个模型只能有一个字段指定primary_key=True(无论是显式声明还是自动添加)。

 

BooleanField

  true/false 字段。

  此字段的默认表单挂件是一个CheckboxInput.

  如果你需要设置null 值,则使用NullBooleanField 来代替BooleanField。

  如果Field.default没有指定的话, BooleanField 的默认值是 None

 

CharField

  一个用来存储从小到很大各种长度的字符串的地方

  如果是巨大的文本类型, 可以用 TextField.

  这个字段默认的表单样式是 TextInput.

  CharField必须接收一个额外的参数:

  CharField.max_length 字段的最大字符长度.max_length将在数据库层和Django表单验证中起作用, 用来限定字段的长度.

 

TextField

  class TextField([**options])

  大文本字段。该模型默认的表单组件是Textarea

 

DecimalField(max_digits=None, decimal_places=None[, **options])

 

  用python中 Decimal 的一个实例来表示十进制浮点数. 有两个 必须的参数:

 

  DecimalField.max_digits

  位数总数,包括小数点后的位数。该值必须大于等于decimal_places.

 

  DecimalField.decimal_places

  小数点后的数字数量

 

  例如,要保存最大为 999 并有两位小数的数字,你应该使用:

 

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

 

  而要存储那些将近10亿,并且要求达到小数点后十位精度的数字:

 

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

 

 

FloatField

 

用Python的一个float 实例来表示一个浮点数.

 

FloatFieldDecimalField

有时候FloatField 类会和DecimalField 类发生混淆. 虽然它们表示都表示实数,但是二者表示数字的方式不一样。FloatField 使用的是Python内部的 float 类型, 而DecimalField 使用的是Python的 Decimal 类型. Decimal精度更高。

 

 

 

FileField

 

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

 

  一个上传文件的字段。

 

  注意:FileField字段不支持primary_keyunique参数,如果使用会生成 TypeError错误

 

有两个可选参数:

 

  FileField.upload_to

  一个本地文件系统的路径,它将附加到MEDIA_ROOT 设置的后面来确定url 属性的值。

  这个路径可能会包含一个 strftime() 格式串,并且会在文件上传时被替换为 实际的date/time作为文件路径 (这样上传的文件就不会塞满你指定的文件夹了).

  示例:image = models.ImageField(upload_to="courses/%Y/%m", verbose_name=u"封面图", max_length=100)

 

  FileField.storage

  一个Storage 对象,用于你的文件的存取。参见管理文件 获取如何提供这个对象的细节。

 

 

 

在模型中调用FileFieldImageField (见下方) 需如下几步:

 

  1. 在你的settings文件中, 你必须要定义 MEDIA_ROOT 作为Django存储上传文件的路径(从性能上考虑,这些文件不能存在数据库中。) 定义一个 MEDIA_URL 作为基础的URL或者目录。确保这个目录可以被web server使用的账户写入。
  2. 在模型中添加FileFieldImageField 字段, 定义 upload_to参数,内容是 MEDIA_ROOT 的子目录,用来存放上传的文件。
  3. 数据库中存放的仅是这个文件的路径 (相对于MEDIA_ROOT). 你很可能会想用由Django提供的便利的url 属性。比如说, 如果你的ImageField 命名为 mug_shot, 你可以在template中用 {{ object.mug_shot.url }}获得你照片的绝对路径。

 

  例如,如果你的 MEDIA_ROOT设定为 '/home/media',并且 upload_to设定为 'photos/%Y/%m/%d'upload_to'%Y/%m/%d'strftime()所格式化;'%Y' 将会被格式化为一个四位数的年份, '%m' 被格式化为一个两位数的月份'%d'是两位数日份。如果你在Jan.15.2007上传了一个文件,它将被保存在/home/media/photos/2007/01/15目录下.

 

如果你想获得上传文件的存盘文件名,或者是文件大小,你可以分别使用 namesize 属性; 更多可用属性及方法信息,请参见 File 类索引 和 Managing files 主题指导.

 

  注意:保存的文件作为模型存储在数据库中的一部分,所以在磁盘上使用的实际的文件名在模型保存完毕之前是不可靠的。

 

  上传的文件对应的URL可以通过使用 url 属性获得. 在内部,它会调用  Storage 类下的url()方法.

 

值得注意的是,无论你在任何时候处理上传文件的需求,你都应该密切关注你的文件将被上传到哪里,上传的文件类型,以避免安全漏洞。认证所有上传文件 以确保那些上传的文件是你所认为的文件。例如,如果你盲目的允许其他人在无需认证的情况下上传文件至你的web服务器的root目录中,那么别人可以上传一个CGI或者PHP脚本然后通过访问一个你网站的URL来执行这个脚本。所以,不要允许这种事情发生。

 

甚至是上传HTML文件也值得注意,它可以通过浏览器(虽然不是服务器)执行,也可以引发相当于是XSS或者CSRF攻击的安全威胁。

 

FileField 实例将会在你的数据库中创建一个默认最大长度为100字符的varchar 列。就像其他的fields一样, 你可以用 max_length 参数改变最大长度的值.

 

 

ImageField

 

  class ImageField([upload_to=None, height_field=None, width_field=None, max_length=100, **options])

 

  继承了 FileField的所有属性和方法, 但还对上传的对象进行校验,确保它是个有效的image.

 

  除了从FileField继承来的属性外,ImageField 还有属性。

 

  为了更便捷的去用那些属性值, ImageField 有两个额外的可选参数

 

  ImageField.height_field

  该属性的设定会在模型实例保存时,自动填充图片的高度.

 

  ImageField.width_field

  该属性的设定会在模型实例保存时,自动填充图片的宽度.

 

  ImageField字段需要调用Pillow 库.

 

  ImageField会创建在你的数据库中 和 varchar 一样,默认最大长度为100和其他字段一样, 你可以使用max_length 参数来设置默认文件最大值.

 

  此字段的默认表单工具是ClearableFileInput.

 

UUIDField

  一个用来存储UUID的字段。使用Python的UUID类。 当使用PostgreSQL数据库时,该字段类型对应的数据库中的数据类型是uuid,使用其他数据库时,数据库对应的是char(32)类型。

  使用UUID类型相对于使用具有primary_key参数的AutoField类型是一个更好的解决方案。 数据库不会自动生成UUID,所以推荐使用default参数:

  import uuid
  from django.db import models

  class MyUUIDModel(models.Model):
      id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
      # other fields

  注意:这里传递给default是一个可调用的对象(即一个省略了括号的方法),而不是传递一个UUID实例给default

 

 

 

 

 

 

 

 

 

 

 

 

 

 

未完待续。。。

posted @ 2017-05-19 09:54  Vincen_shen  阅读(408)  评论(0)    收藏  举报