Model 字段类型
Feild命名的限制
Django 对字段的命名只有两个限制:
- 
字段的名称不能是Python 保留的关键字,因为这将导致一个Python 语法错误。例如:
class Example(models.Model): pass = models.IntegerField() # 'pass' is a reserved word! - 
由于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 实例来表示一个浮点数.
FloatField 与DecimalField
有时候FloatField 类会和DecimalField 类发生混淆. 虽然它们表示都表示实数,但是二者表示数字的方式不一样。FloatField 使用的是Python内部的 float 类型, 而DecimalField 使用的是Python的 Decimal 类型. Decimal精度更高。
FileField
- class FileField([upload_to=None, max_length=100, **options])
 
一个上传文件的字段。
注意:FileField字段不支持primary_key 和unique参数,如果使用会生成 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 对象,用于你的文件的存取。参见管理文件 获取如何提供这个对象的细节。
 
在模型中调用FileField 或 ImageField (见下方) 需如下几步:
- 在你的settings文件中, 你必须要定义 MEDIA_ROOT 作为Django存储上传文件的路径(从性能上考虑,这些文件不能存在数据库中。) 定义一个 MEDIA_URL 作为基础的URL或者目录。确保这个目录可以被web server使用的账户写入。
 - 在模型中添加FileField 或 ImageField 字段, 定义 upload_to参数,内容是 MEDIA_ROOT 的子目录,用来存放上传的文件。
 - 数据库中存放的仅是这个文件的路径 (相对于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目录下.
如果你想获得上传文件的存盘文件名,或者是文件大小,你可以分别使用 name 和 size 属性; 更多可用属性及方法信息,请参见 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
未完待续。。。
                    
                
                
            
        
浙公网安备 33010602011771号