二、Django创建数据库模型
引用:
from django.db import models
创建:
在models.py中创建的每一个类都为表,类变量即为表字段,类变量赋予的值相当于字段属性。models.Model
字段说明:
- | 类型名称 | 类方法 | widget | 必填参数 |
数值型 | int自增列 | AutoField | TextInput | primary_key=True |
bigint自增列 | BigAutoField | TextInput | primary_key=True | |
小整数(32768~32767) | SmallIntegerField | TextInput | ||
正小整型(0~32767) | PositiveSmallIntegerField | TextInput | ||
整数(-2147483648~2147483647) | IntegerField | TextInput | ||
正整数(0~2147483647) | PositiveIntegerField | TextInput | ||
长整型(-9223372036854775808~9223372036854775807) | BigIntegerField | TextInput | ||
浮点型 | FloatField | TextInput | ||
10进制小数 | DecimalField | TextInput |
max_digits: 小数总长度 |
|
二进制类型 | BinaryField | TextInput | ||
字符型 | 字符型 | CharField | TextInput | max_length |
文本类型 | TextField | Textarea | ||
Email类型(字符串) | EmailField | TextInput | ||
IP4&6类型(字符串) | GenericIPAddressField | TextInput | ||
URL类型(字符型) | URLField | TextInput | ||
字母、数字、下划线、连接符(减号) | SlugField | TextInput | ||
逗号分割的数字 | CommaSeparatedIntegerField | TextInput | max_length | |
UUID类型(字符型) | UUIDField | TextInput | ||
文件型 | 提供读取文件夹下文件 | FilePathField | CharField |
path |
它是一个 CharField ,它用来选择文件系统下某个目录里面的某些文件。它有三个专有的参数,只有第一个参数是必须的: path: 这个参数是必需的。它是一个目录的绝对路径,而这个目录就是 FilePathField 用来选择文件的那个目录。比如: "/home/images"。 match: 可选参数。它是一个正则表达式字符串, FilePathField 用它来过滤文件名称,只有符合条件的文件才出现在文件选择列表中。要注意正则表达式只匹配文件名,而不是匹配文件路径。 例如:"foo.*\.txt$" 只匹配名为foo23.txt 而不匹配 bar.txt 和 foo23.gif。 recursive: 可选参数。它的值是 True 或 False。默认值是 False。它指定是否包含 path 下的子目录。 allow_files: 该项属于Django1.5新增内容。可选参数,它的值是 True 或 False。默认值是 True。它指定是否包含指定位置的文件。该项与allow_folders 必须有一个是 True。 allow_folders: Django1.5新增内容。可选参数,它的值是True或False。默认是False。它指定是否包含指定位置的目录。该项与allow_files必须有一个是 True。 前面已经提到了 match 只匹配文件名称,而不是文件路径。所以下面这个例子:
FilePathField(path="/home/images", match="foo.*", recursive=True)
将匹配 /home/images/foo.gif ,而不匹配 /home/images/foo/bar.gif。这是因为 match 只匹配文件名(foo.gif 和 bar.gif)。 默认情况下, FilePathField 实例在数据库中的对应列是varchar(100) 。和其他字段一样,你可以利用 max_length 参数改变字段的最大长度。 |
||||
文件上传到指定目录 | FileField | FileInput |
upload_to |
|
class FileField(upload_to=None[, max_length=100, **options]) Note:该字段不支持primary_key和unique 参数,否则会抛出TypeError 异常。 它有一个必须的参数: upload_to: 用于保存文件的本地文件系统。它根据 MEDIA_ROOT 设置确定该文件的 url 属性。 该路径可以包含 时间格式串strftime(),可以在上传文件的时候替换成当时日期/时间(这样,就不会出现在上传文件把某个目录塞满的情况了)。 该参数也可以是一个可调用项,比如是一个函数,可以调用函数获得包含文件名的上传路径。这个可调用项必须要接受两个参数,并且返回一个保存文件用的 Unix-Style 的路径(用/斜杠)。两个参数分别是: instance :定义了当前 FileField 的 model 实例。更准确地说,就是以该文件为附件的 model 实例。 大多数情况下,在保存该文件时, model 实例对象还并没有保存到数据库,这是因为它很有可能使用默认的 AutoField,而此时它还没有从数据库中获得主键值。 filename :上传文件的原始名称。在生成最终路径的时候,有可能会用到它。 还有一个可选的参数: storage: 负责保存和获取文件的对象。 默认的form widget是FileInput。 Note:在 model 中使用 FileField 或 ImageField 要按照以下的步骤:
例如,假设你的 MEDIA_ROOT 被设为 '/home/media',upload_to 被设为 'photos/%Y/%m/%d'。 upload_to 中的 '%Y/%m/%d' 是一个strftime(),'%Y' 是四位的年份,'%m' 是两位的月份,'%d' 是两位的日子。如果你在2007年01月15号上传了一个文件,那么这个文件就保存在/home/media/photos/2007/01/15 目录下。 如果你想得到上传文件的本地文件名称,文件网址或是文件的大小,你可以使用 name, url 和 size 属性。 Note:在上传文件时,要警惕保存文件的位置和文件的类型,这么做的原因是为了避免安全漏洞。对每一个上传文件都要验证,这样你才能确保上传的文件是你想要的文件。举个例子,如果你盲目地让别人上传文件,而没有对上传文件进行验证,如果保存文件的目录处于 web 服务器的根目录下,万一有人上传了一个 CGI 或是 PHP脚本,然后通过访问脚本网址来运行上传的脚本,那可就太危险了。千万不要让这样的事情发生!默认情况下,FileField 实例在数据库中的对应列是 varchar(100) ,和其他字段一样,你可以利用max_length 参数改变字段的最大长度。 |
||||
图片上传到指定目录 | ImageField | FileInput | upload_to | |
class ImageField(upload_to=None[, height_field=None, width_field=None, max_length=100,**options])和FileField一样,只是会验证上传对象是不是一个合法的图象文件。除了那些在FileField中有效的参数之外, ImageField 还可以使用 File.height and File.width 两个属性 。它有两个可选参数:height_field:保存图片高度的字段名称。在保存对象时,会根据该字段设定的高度,对图片文件进行缩放转换。width_field:保存图片宽度的字段名称。在保存对象时,会根据该字段设定的宽度,对图片文件进行缩放转换。默认情况下,ImageField 实例对应着数据库中的varchar(100) 列。和其他字段一样,你可以使用max_length 参数来改变字段的最大长度。 | ||||
日期型 | 日期型 | DateField | TextInput |
auto_now auto_now_add |
日期时间型 | DateTimeField | TextInput | 同DateField | |
时间型 | TimeField | TextInput | 同DateField | |
布尔 | 布尔型 | BooleanField | CheckboxInput | |
空布尔 | NullBooleanField | NullBooleanSelect |
参数说明:
参数名称 | 默认值 | 说明 |
null | False | 数据库中字段是否可以为空 |
blank | django的Admin中添加数据时是否可允许空值 | |
primary_key | False | 主键,设置后,就会代替原来的自增 id 列 |
auto_now | 自动创建---无论添加或修改,都是当前操作的时间 | |
auto_now_add | 自动创建---永远是创建时的时间 | |
choices | Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作 | |
代码如下: gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1)
|
||
default | 长度 | |
verbose_name | Admin中字段的显示名称 | |
db_column | 数据库中的字段名称 | |
unique | False | 不允许重复 |
db_index | False | 数据库索引 |
editable | False | 在Admin里是否可编辑 |
error_messages | 自定义错误信息(字典类型),从而定制想要显示的错误信息; | |
字典健:null, blank, invalid, invalid_choice, unique, and unique_for_date 如:{'null': "不能为空.", 'invalid': '格式错误'} |
||
auto_created | False | 自动创建 |
help_text | 在Admin中提示帮助信息 | |
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'), ]
)
|
||
upload-to | 文件上传路径 |
外键说明:
一对多:models.ForeignKey(其他表)
一对多:当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择)
例如:创建用户信息时候,需要选择一个用户类型【普通用户】【金牌用户】【铂金用户】等。
代码:
a=models.ForeignKey(to='TableName',to_field='id')
ForeignKey的参数:
参数名称 | 参数说明 |
to=None, | 要进行关联的表名 |
to_field=None, | 要关联的表中的字段名称 |
on_delete=None, |
当删除关联表中的数据时,当前表与其关联的行的行为,内部可传递的变量有: - a. 与之关联的值设置为指定值,设置:models.SET(值) |
related_name=None, | 反向操作时,使用的字段名,用于代替 【表名_set】 |
related_query_name=None, | 反向操作时,使用的连接前缀,用于替换【表名】 |
limit_choices_to=None, | 在Admin或ModelForm中显示关联数据时,提供的条件 |
db_constraint=True | 是否在数据库中创建外键约束 |
parent_link=False | 在Admin中是否显示关联数据 |
多对多:models.ManyToManyField(其他表)
多对多:在某表中创建一行数据是,有一个可以多选的下拉框
例如:创建用户信息,需要为用户指定多个爱好
ManyToManyField参数:
参数名称 | 参数说明 |
to=None |
要进行关联的表名 |
related_name=None | 反向操作时,使用的字段名,用于代替 【表名_set】 如: obj.表名_set.all() |
related_query_name=None | 反向操作时,使用的连接前缀,用于替换【表名】 如: models.UserGroup.objects.filter(表名__字段名=1).values('表名__字段名') |
limit_choices_to=None |
在Admin或ModelForm中显示关联数据时,提供的条件: from django.db.models import Q - limit_choices_to=Q(nid__gt=10) - limit_choices_to=Q(nid=8) | Q(nid__gt=10) - limit_choices_to=lambda : Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root') |
symmetrical=None | 仅用于多对多自关联时,symmetrical用于指定内部是否创建反向操作的字段 |
through=None | 自定义第三张表时,使用字段用于指定关系表 |
through_fields=None |
自定义第三张表时,使用字段用于指定关系表中那些字段做多对多关系表: from django.db import models class Person(models.Model): name=models.CharField(max_length=50) class Group(models.Model): name=models.CharField(max_length=128) members=models.ManyToManyField( Person, through='Membership', through_fields=('group', 'person'), ) class Membership(models.Model): group=models.ForeignKey(Group, on_delete=models.CASCADE) person = models.ForeignKey(Person,on_delete=models.CASCADE) inviter=models.ForeignKey( Person, on_delete=models.CASCADE, related_name="membership_invites", ) invite_reason=models.CharField(max_length=64)
|
db_constraint=True | 是否在数据库中创建外键约束 |
db_table=None | 默认创建第三张表时,数据库中表的名称 |
一对一:models.OneToOneField(其他表)
一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了)
例如:原有含10列数据的一张表保存相关信息,经过一段时间之后,10列无法满足需求,需要为原来的表再添加5列数据
OneToOneField参数:
参数名称 | 参数说明 |
to | 要进行关联的表名 |
to_field=None | 要关联的表中的字段名称 |
on_delete=None | 当删除关联表中的数据时,当前表与其关联的行的行为 |