五 Django-模型字段

一、概要

模型是你的数据的唯一的信息源。它包含你所储存数据的必要字段和行为。通常,每个模型对应数据库中唯一的一张表。

  • 每个模型都是django.db.models.Model的一个Python 子类。
  • 模型的每个属性都表示为数据库中的一个字段。
  • 通过所有这一切,Django为你提供一个自动生成的数据库访问API
image

模型包括

  1. 字段、
  2. 字段类型、
  3. 字段选项、
  4. 元信息等组成

二、字段

1、说明

对于一个模型来说,最重要的和不可或缺的是列出该模型在数据库中定义的字段。字段由fields类属性指定。要注意选择的字段名称不要和 models API 冲突,比如cleansave 或者delete

2、模型

  1. 示例代码
    from django.db import models
    class UserInfo(models.Model):
        # 自定义主键
        uid = models.AutoField(primary_key=True)
        # 用户名
        username = models.CharField(max_length=64)
        password = models.CharField(max_length=32)
        SEX_CHOICES = (
            (u'1', u'男'),
            (u'2', u'女'),
        )
        sex = models.CharField(max_length=1, choices=SEX_CHOICES)
        age = models.IntegerField()
        create_date = models.DateTimeField(auto_now_add=True)
    

3、SQL语句

  1. 示例代码
    CREATE TABLE `hello_user` (
      `uid` int(11) PRIMARY KEY AUTO_INCREMENT,
      `username` varchar(64) NOT NULL,
      `password` varchar(64) NOT NULL,
      `sex` varchar(1) NOT NULL,
      `age` int(11) NOT NULL,
      `create_date` datetime(6) NOT NULL,
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

4、数据库表

  1. 示例图


    image

三、字段类型

模型中的每个字段都是 [Field]子类的某个实例。 Django根据字段的类型确定以下信息:

  • 列类型,它告知数据库要存储哪种数据(例如:INTEGERVARCHAR,DATE,TEXT)。
  • 渲染表单时使用的默认HTML(例如,<input type="text">, <select>)。
  • 最低限度的验证需求,它被用在 Django 管理站点和自动生成的表单中。

1、常用类型

1、IntegerField


  1. IntegerField( **options )
  2. 说明
    一个整数。来自-2147483648到的值2147483647`所支持的数据库都是安全的
    注意 在1.10的版本后不要使用 max_length,框架会自动忽略该选项
  3. 示例代码
    class UserInfo(models.Model):
        # 年龄
        age = models.IntegerField()
    

2、AutoField(常用)


  1. AutoField(primary_key=False [, **options])
  2. 说明
    自动递增主键,如果没有的话,框架默认会为每一个表生成一个名称为id的列,int类型长度为11位,每个模型只能有一个字段指定
  3. 常用参数
    • primary_key=True
    • 如果要显示的自定义一个自增列,必须该参数
  4. 示例代码
    class UserInfo(models.Model):
        # 默认
        # id = models.AutoField(primary_key=True)
        # 自定义主键
        uid = models.AutoField(primary_key=True)
    

3、BigAutoField


  1. AutoField(primary_key=False [, **options])
  2. 说明
    一个64位整数,很像一个AutoField不同之处在于它是保证从适合数字19223372036854775807
  3. 参数
    同AutoField
  4. 示例代码
    class TUser(models.Model):
        # 自定义主键
        uid = models.BigAutoField(primary_key=True)
    

4、CharField

  1. 方法
    CharField(max_length=none[, **options])
  2. 说明
    字符串字段
  3. 常用参数
    max_length --表明字段的最大长度(以字符为单位),utf-8下(最大为 21812),gbk下(最大为32766)
  4. 示例代码
    class UserInfo(models.Model):
        # 用户名 ,数据库字段的长度64
        username = models.CharField(max_length=64)
    

5、DateField

  1. 方法
    DateField([auto_now=False, auto_now_add=False, **options])
  2. 说明
    日期,用Python表示的一个datetime.date实例
  3. 参数
    • auto_now
      这个参数的默认值为false,设置为true时,能够在保存该字段时,将其值设置为当前时间,并且每次修改model,都会自动更新。因此这个参数在需要存储“最后修改时间”的场景下,十分方便。需要注意的是,设置该参数为true时,并不简单地意味着字段的默认值为当前时间,而是指字段会被“强制”更新到当前时间,你无法程序中手动为字段赋值;如果使用django再带的admin管理器,那么该字段在admin中是只读的
      该字段只在调用时自动更新 Model.save()。以其他方式更新其他字段时,字段不会更新,
      例如QuerySet.update(),您可以在更新中为字段指定自定义值
    • auto_now_add
      这个参数的默认值也为False,设置为True时,会在model对象第一次被创建时,将字段的值设置为创建时的时间,以后修改对象时,字段的值不会再更新。该属性通常被用在存储“创建时间”的场景下。与auto_now类似,auto_now_add也具有强制性,一旦被设置为True,就无法在程序中手动为字段赋值,在admin中字段也会成为只读的
  4. 注意事项
    auto_now_addauto_nowdefault不能同时存在
  5. 示例代码
    class UserInfo(models.Model):
        #账号创建时间
        create_date = models.DateField(auto_now_add=True)
    

6、DateTimeField

  1. 方法
    DateTimeField([auto_now=False, auto_now_add=False, **options])
  2. 说明
    日期和时间,用Python表示的一个datetime.datetime实例
  3. 参数
    同DateField的参数
  4. 示例代码
    class UserInfo(models.Model):
        #账号创建时间
        create_date = models.DateField(auto_now_add=True)
        #最后一次登录时间
        last_date = models.DateTimeField(auto_now=True)
    

7、DecimalField

  1. 方法
    DecimalField(max_digits=None,decimal_places=None[, **options])
  2. 说明
    表示固定精度的十进制数的字段,通常用来表示金额
  3. 常用参数
    • max_digits
      数字允许的最大位数
    • decimal_places
      小数的最大位数
  4. 注意事项
    两个参数必传
  5. 示例代码
    class GoodsInfo(models.Model):
        price = models.DecimalFile(maxdigits=9,decimal_places=2)
    

8、FileField

  1. 方法
    FileField(upload_to=None, max_length=100, _*_options*)
  2. 说明
    文件上传字段
  3. 参数
    • upload_to
      设置上传目录和文件名,可以是字符串形式,也可是一个函数
    • max_length
      长度
  4. 注意事项
    该字段不支持primary_key和unique参数,否则类型错误
  5. 示例代码
    class UserInfo(models.Model):
        # 注意前面不要加/
        pic = models.FileField(upload_to='uploads/')
        pic = models.FileField(upload_to='uploads/%Y/%m/%d/')
    
    """
    instance 模型实例
    filename 文件名称
    """
    def user_pic_path(instance, filename):
        return 'user_{0}/{1}'.format(instance.user.uid, filename)
    class UserInfo(models.Model):
        # 自定义主键
        uid = models.AutoField(primary_key=True)
        pic = models.FileField(upload_to=user_pic_path)
    

9、ImageField


  1. ImageField(upload_to = None,height_field = None_,_width_field = None_,_max_length = 100,**options)
  2. 说明
    在 FileField 基础上加上是否是合法图片验证功能的一个类型,还有height_field,width_field等属性
  3. 参数
    • upload_to
      设置上传目录和文件名,可以是字符串形式,也可是一个函数
    • height_field
      图片的高度
    • width_field
      图片的宽度
  4. 注意
    该字段要求 Python Imaging 库Pillow
  5. 示例代码
    def user_pic_path(instance, filename):
        return 'user_{0}/{1}'.format(instance.user.uid, filename)
    class UserInfo(models.Model):
        # 自定义主键
        uid = models.AutoField(primary_key=True)
        pic = models.ImageFiled(upload_to=user_pic_path,height_field=100,width_field=100)
    

10、FloatField


  1. FloatField(**options)
  2. 说明
    与 python 里的 float 实例相同,django使用来表示它,虽然 FloatField 与 DecimalField 都是表示小数点,
    但却是不同的表现形式,
  3. 注意事项
    FloatField 当小数点,但是 DecimalField 用的却是 Decimal 类型
  4. 示例代码
    class UserInfo(models.Model):
        height = models.FloatField()
    

11、BooleanField

  1. BooleanField(**options)
  2. 说明
    一个布尔值(true/false)字段。
    如果要使用null作为空值,可使用NullBooleanField
  3. 示例代码
    class User(models.Model):
        is_delete = models.BooleanField()
    

12、TextField

大文本类型数据类型,尽量拆解成CharField类型

2、其它(了解)

1、IPAddressField

点分十进制表示的IP地址,如10.0.0.1

2、GenericIPAddressField

ip v4和ip v6地址表示,ipv6遵循RFC 4291section 2.2,

3、NullBooleanField

可以包含空值的布尔类型,相当于设置了null=True的BooleanField。

4、PositiveIntegerField

正整数或0类型,取值范围为[0 ,2147483647]

5、PositiveSmallIntegerField

正短整数或0类型,类似于PositiveIntegerField,取值范围依赖于数据库特性,[0 ,32767]的取值范围对Django所支持的数据库都是安全的。

6、SlugField

只能包含字母,数字,下划线和连字符的字符串,通常被用于URLs表示。可选参数max_length=50,prepopulate_from用于指示在admin表单中的可选值。db_index,默认为True。

7、SmallIntegerField

小整数字段,类似于IntegerField,取值范围依赖于数据库特性,[-32768 ,32767]的取值范围对Django所支持的数据库都是安全的

9、TimeField

时间,对应Python的datetime.time

10、URLField

存储URL的字符串,默认长度200;verify_exists(True),检查URL可用性

11、UUIDField

用于存储通用唯一标识符的字段。使用Python的 UUID类。在PostgreSQL上使用时,这将存储在一个 uuid数据类型,否则在一个char(32) 通过的是AutoField

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • 一、说明 所有的模型字段都可以接收一定数量的参数,比如CharField至少需要一个max_length参数。下面...
    唯老阅读 1,164评论 0 6
  • models操作----字段 及 参数 所有字段类型: AutoField(Field) -int自增列,必须填入...
    nobodyXu阅读 1,962评论 0 4
  • Django 准备 “虚拟环境为什么需要虚拟环境:到目前位置,我们所有的第三方包安装都是直接通过 pip inst...
    33jubi阅读 1,315评论 0 5
  • 一、前期概要 1.1 名词解释 关系:事物之间相互作用、相互联系的状态。 关联:名词:表示对象(数据库表)之间的关...
    唯老阅读 920评论 0 4
  • 地狱之门打开后 贪婪地向人间吐着火舌 在黑暗的遮掩下 肆无忌惮的吞噬着一切 待人类的躯壳烧至焦黑 自由的灵魂喷涌而...
    黑猫001阅读 245评论 0 1