数据模型字段及属性详解
在设计数据模型的时候,我们需要根据不同的需求,设计不同的表和不同的字段。不同的字段也可以设置不同的参数。
一个模型(model)就是一个单独的、确定的数据的信息源,包含了数据的字段和操作方法。Django是通过Model操作数据库,不管你数据库的类型是MySql或者Sqlite,Django它自动帮你生成相应数据库类型的SQL语句,所以不需要关注SQL语句和类型,对数据的操作Django帮我们自动完成。只要回写Model就可以了!
django根据代码中定义的类来自动生成数据库表。我们写的类表示数据库的表,如果根据这个类创建的对象是数据库表里的一行数据,对象.id 对象.value是每一行里的数据。
基本的原则如下: 每个模型在Django中的存在形式为一个Python类 每个模型都是django.db.models.Model的子类 模型里的每个类代表数据库中的一个表 模型的每个字段(属性)代表数据表的某一列 Django将自动为你生成数据库访问API
Django这种操作数据库的方式,我们把它叫做:关系对象映射(Object Relational Mapping,简称ORM)。
我们之前有在管理后台与model模型这文章里简单的接触过。里面的models代码:
class Category(models.Model):
name = models.CharField('分类',max_length=100)
class Tags(models.Model):
name = models.CharField('标签',max_length=100)
class Article(models.Model):
title = models.CharField('标题',max_length=70)
intro = models.TextField('摘要', max_length=200, blank=True)
category = models.ForeignKey(Category, on_delete=models.CASCADE, verbose_name='分类', default='1')
tags = models.ManyToManyField(Tags, blank=True)
body = models.TextField()
user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='作者')
created_time = models.DateTimeField('发布时间',auto_now_add=True)
字段是模型中最重要的内容之一,也是唯一必须的部分。字段在Python中表现为一个类属性,体现了数据表中的一个列。Django不允许下面两种字段名:1、与Python关键字冲突。2、字段名中不能有两个以上下划线在一起,因为两个下划线是Django的查询语法。也不要使用clean、save、delete等Django内置的模型API名字,防止命名冲突。
每一个字段都是一个类属性,每个类属性表示数据表中的一个列。上面那个models生成数据后,在数据库里是这样的:

表名由Django自动生成,例如我们的Article类会自动生成为blog_Article,默认格式为“应用名称+下划线+小写类名”。如果你不指定主键,Django默认自动创建自增主键id。每个APP应用都有独立属于自己的模型,创建了APP之后,在使用它之前,你需要先在settings文件中的INSTALLED_APPS 处,注册models.py文件所在的app名称。看清楚了,是注册app,不是模型,也不是models.py。关于settings,我们前面也有讲解过,具体可查看文章:全局配置settings详解。例如我们创建了名为blog的应用APP则在settings这样写:
INSTALLED_APPS = [
#...
'blog', #我们要添加的应用名
#...
]
当你每次对模型进行增、删、修改时,我们都需要执行python manage.py makemigrations请务必执命令,然后再执行:python manage.py migrate,让操作实际应用到数据库上。
下面我把常用的字段和常用的参数列出来,供大家参考。
一、常用字段:
1、AutoField —自增列 = int(11) 如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。 2、CharField —字符串字段 单行输入,用于较短的字符串,如要保存大量文本, 使用 TextField。必须 max_length 参数,django会根据这个参数在数据库层和校验层限制该字段所允许的最大字符数。 3、BooleanField —布尔类型=tinyint(1) 不能为空,Blank=True 4、ComaSeparatedIntegerField —用逗号分割的数字=varchar 继承CharField,所以必须 max_lenght 参数, 5、DateField —日期类型 date 对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。 6、DateTimeField —日期类型 datetime 同DateField的参数 7、Decimal —十进制小数类型 = decimal 必须指定整数位max_digits和小数位decimal_places 8、EmailField —字符串类型(正则表达式邮箱) =varchar 对字符串进行正则表达式 一个带有检查 Email 合法性的 CharField,不接受 maxlength 参数。 9、FloatField —浮点类型 = double 浮点型字段。 必须提供两个 参数, 参数描述: max_digits:总位数(不包括小数点和符号) decimal_places:小数位数。如:要保存最大值为 999 (小数点后保存2位),你要这样定义字段:FloatField(…,max_digits=5, decimal_places=2),要保存最大值一百万(小数点后保存10位)的话,你要这样定义:FloatField(…,max_digits=19, decimal_places=10) 10、IntegerField —整形 用于保存一个整数 11、BigIntegerField —长整形
integer_field_ranges = {
'SmallIntegerField': (-32768, 32767),
'IntegerField': (-2147483648, 2147483647),
'BigIntegerField': (-9223372036854775808, 9223372036854775807),
'PositiveSmallIntegerField': (0, 32767),
'PositiveIntegerField': (0, 2147483647),
}
12、IPAddressField —字符串类型(ip4正则表达式) 一个字符串形式的 IP 地址, (如 “202.1241.30″)。 13、GenericIPAddressField —字符串类型(ip4和ip6是可选的) 参数protocol可以是:both、ipv4、ipv6 验证时,会根据设置报错 14、NullBooleanField —允许为空的布尔类型 类似 BooleanField, 不过允许 NULL 作为其中一个选项。 推荐使用这个字段而不要用 BooleanField 加 null=True 选项。 admin 用一个选择框
24、FilePathField —选择指定目录按限制规则选择文件,有三个参数可选, 其中”path”必需的,这三个参数可以同时使用, 参数描述:
path:必需参数,一个目录的绝对文件系统路径。 FilePathField 据此得到可选项目。 Example: “/home/images”;
match:可选参数, 一个正则表达式, 作为一个字符串, FilePathField 将使用它过滤文件名。 注意这个正则表达式只会应用到 base filename 而不是路径全名。 Example: “foo。\。txt^”, 将匹配文件 foo23.txt 却不匹配 bar.txt 或 foo23.gif;
recursive:可选参数, 是否包括 path 下全部子目录,True 或 False,默认值为 False。
match 仅应用于 base filename, 而不是路径全名。 如:FilePathField(path=”/home/images”, match=”foo.”, recursive=True)…会匹配 /home/images/foo.gif 而不匹配 /home/images/foo/bar.gif
25、FileField —文件上传字段。 要求一个必须有的参数: upload_to, 一个用于保存上载文件的本地文件系统路径。 这个路径必须包含 strftime formatting, 该格式将被上载文件的 date/time 替换(so that uploaded files don’t fill up the given directory)。在一个 model 中使用 FileField 或 ImageField 需要以下步骤:在你的 settings 文件中, 定义一个完整路径给 MEDIA_ROOT 以便让 Django在此处保存上传文件。 (出于性能考虑,这些文件并不保存到数据库。) 定义 MEDIA_URL 作为该目录的公共 URL。 要确保该目录对 WEB 服务器用户帐号是可写的。在你的 model 中添加 FileField 或 ImageField, 并确保定义了 upload_to 选项,以告诉 Django 使用 MEDIA_ROOT 的哪个子目录保存上传文件。你的数据库中要保存的只是文件的路径(相对于 MEDIA_ROOT)。 出于习惯你一定很想使用 Django 提供的 get_
二、常用选项参数意义
1、null 数据库中字段是否可以为空(null=True) 2、db_column 数据库中字段的列名(db_column=“test”) 3、db_tablespace 4、default 数据库中字段的默认值 5、primary_key 数据库中字段是否为主键(primary_key=True) 6、db_index 数据库中字段是否可以建立索引(db_index=True) 7、unique 数据库中字段是否可以建立唯一索引(unique=True) 8、unique_for_date 数据库中字段【日期】部分是否可以建立唯一索引 9、unique_for_month 数据库中字段【月】部分是否可以建立唯一索引 10、unique_for_year 数据库中字段【年】部分是否可以建立唯一索引 11、auto_now 更新时自动更新当前时间 12、auto_now_add 创建时自动更新当前时间 13、verbose_name Admin中显示的字段名称 14、blankAdmin 中是否允许用户输入为空表单提交时可以为空 15、editableAdmin 中是否可以编辑 16、help_textAdmin 中该字段的提示信息 17choicesAdmin 中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作 如:
sex=models.IntegerField(choices=[(0,'男'),(1,'女'),],default=1)
error_messages自定义错误信息(字典类型),从而定制想要显示的错误信息; 字典健:null,blank,invalid,invalid_choice,unique,andunique_for_date 如:{’null’:“不能为空.”,‘invalid’:‘格式错误’} 18、validators 自定义错误验证(列表类型),从而定制想要的验证规则
from django.core.validators import RegexValidator
from django.core.validators import EmailValidator,URLValidator,DecimalValidator,
MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
如:
test = models.CharField(
max_length=32,
error_messages={
'c1': '优先错信息1',
'c2': '优先错信息2',
'c3': '优先错信息3',
},
validators=[
RegexValidator(regex='root_\d+', message='错误了', code='c1'),
RegexValidator(regex='root_112233\d+', message='又错误了', code='c2'),
EmailValidator(message='又错误了', code='c3'), ]
)