欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Django框架(五):模型(一) 定义属性

程序员文章站 2022-06-15 15:21:27
1. 定义属性 Django根据属性的类型确定以下信息: 当前选择的数据库支持字段的类型 渲染管理表单时使用的默认html控件 在管理站点最低限度的验证 django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列。 默认创 ......

1. 定义属性

django根据属性的类型确定以下信息:

  • 当前选择的数据库支持字段的类型
  • 渲染管理表单时使用的默认html控件
  • 在管理站点最低限度的验证

django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列。

默认创建的主键列属性为id,可以使用pk代替,pk全拼为primary key。

pk是主键的别名,若主键名为id2,那么pk是id2的别名。

属性命名限制:

  • 不能是python的保留关键字。
  • 不允许使用连续的下划线,这是由django的查询方式决定的,在第4节会详细讲解查询。
  • 定义属性时需要指定字段类型,通过字段类型的参数指定选项。

前面已经简单的使用过了,只是没有详细介绍,语法:

属性=models.字段类型(选项)

1.1 字段类型

(1) autofield

自动增长的integerfield,通常不用指定,不指定时django会自动创建属性名为id的自动增长属性。

自定义一个主键:

my_id=models.autofield(primary_key=true)

(2) booleanfield

布尔字段,值为true或false。

(3) nullbooleanfield

类似booleanfield,支持null、true、false三种值。

(4) charfield(max_length=字符长度)

字符串。

参数max_length表示最大字符个数。

(5) textfield

大文本字段,一般超过4000个字符时使用。

(6) integerfield

整数。

(7) decimalfield(max_digits=none, decimal_places=none)

十进制浮点数。

参数max_digits表示总位数。

参数decimal_places表示小数位数。

(8) floatfield

浮点数。

(9) datefield[auto_now=false, auto_now_add=false])

日期。

参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false。

参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false。

参数auto_now_add和auto_now是相互排斥的,组合将会发生错误。

(10) timefield

时间,参数同datefield。

(11) datetimefield

日期时间,参数同datefield。

(12) filefield

上传文件字段。

参数:upload_to,一个用于保存上传文件的本地文件系统路径。

(13) imagefield

继承于filefield,对上传的内容进行校验,确保是有效的图片。

有两个可选参数:height_field和width_field。将图片按照提供的高度和宽度规格保存。

(14) commaseparatedintegerfield(max_length)

逗号分隔开的整数字段。

参数与charfield一样。

(15) filepathfield(path,[match],[recursive])

拥有多个可选项的字段,选项被限定为文件系统中某个目录下的文件名。

(16) emailfield

能检查值是否是有效的电子邮件地址的charfield。

(17) ipaddressfield

ip地址,以字符串格式表示。

例如:"192.168.0.1"

(18) phonenumberfield

检查值是否是一个合法的美式电话格式。

(19) positiveintegerfield

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

(20) slugfield

内容简短的标签,这段内容只能包含字母、数字、下划线或连字符。通常用于url中。

(21) smallintegerfield

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

(22) urlfield

用来存储url的字段。

(23) usstatefield

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

(24) xmlfield(schema_path)

类似textfield,只不过要检查值是否匹配指定schema的合法xml。

1.2 选项

通过选项实现对字段的约束。

null:如果为true,表示允许为空,默认值是false。

blank:如果为true,则该字段允许为空白,默认值是false。

要注意,这与 null 不同。null纯粹是数据库范畴的,而blank是数据验证范畴的。

如果一个字段的blank=true,表单的验证将允许该字段是空值。如果字段的blank=false,该字段就是必填的。

db_column:字段的名称,如果未指定,则使用属性的名称。

db_index:若值为true, 则在表中会为此字段创建索引,默认值是false。

default:默认值。

primary_key:若为true,则该字段会成为模型的主键字段,默认值是false,一般作为autofield的选项使用。

unique:如果为true, 这个字段在表中必须有唯一值,默认值是false。

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

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

help_text:在管理界面表单对象里显示在字段下面的额外帮助文本。

radio_admin:默认的,对于foreignkey或者拥有choices设置的字段,django管理界面会使用列表选择框(<select>)。如果radio_admin设置为true的话,django就会使用单选按钮界面。

unique_for_date:把它的值设成一个datefield或者datetimefield的字段的名称,可以确保字段在这个日期内不会出现重复值。

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

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

verbose_name:除foreignkey、manatomanyfield和onetoonefield之外的字段都接受一个详细名称作为第一个位置参数。

1.3 简单演示

#图书类
class bookinfo(models.model):
    '''图书模型类'''
    # 图书名称
    btitle = models.charfield(max_length=20, db_column='title')
    # 图书名字唯一
    # btitle = models.charfield(max_length=20, unique=true, db_index=true)
    # 价格,最大位数为10,小数为2
    # bprice = models.decimalfield(max_digits=10, decimal_places=2)
    # 出版日期
    bpub_date = models.datefield()
    # bpub_date = models.datefield(auto_now_add=true) # 创建时间
    # bpub_date = models.datefield(auto_now=true) # 更新时间
    # 阅读量
    bread = models.integerfield(default=0)
    # 评论量
    bcomment = models.integerfield(default=0)
    # 删除标记
    isdelete = models.booleanfield(default=false)

class roleinfo(models.model):
    '''角色人物模型类'''
    # 角色名
    rname = models.charfield(max_length=20)
    # 性别
    rgender = models.booleanfield(default=false)
    # 描述信息
    rcomment = models.charfield(max_length=200, null=true, blank=false)
    # 关系属性
    rbook = models.foreignkey('bookinfo',on_delete=models.cascade)
    # 删除标记
    isdelete = models.booleanfield(default=false)