Django中的AutoField字段使用


Posted in Python onMay 18, 2020

【Django是一个机智的框架】

默认情况下Djang会为ORM中定义的每一张表加上一个自增ID列,并且用这个列来做主键;出于一个MySQL-DBA的工作经历我觉得

Djanog还真是机智;这样么说主要是因为我遇到过许多主从延时的问题,有些比较过分的会延时好几周,通常这些都是因为binlog格式

为“ROW”但是表上不存在主键引起的。

如果当前网站用的是Django开发的,我想就不会有这种事情发生了吧。

【AutoField】

Django默认的行为就像这样

class TestModel(models.Model):
id = models.AutoField(primary_key=True)

数据库层面对应的SQL如下

CREATE TABLE `myapp_testmodel` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

【注意】

如果你想的工增加AutoField列,但是又不指定这个列做为主键的话,是会报错的

class TestModel(models.Model):
tid = models.AutoField()

不显示指定主键,但是又给表增加AutoField列的话就会报错

assert not cls._meta.auto_field, "Model %s can't have more than one AutoField." % cls._meta.label
AssertionError: Model myapp.TestModel can't have more than one AutoField.

补充知识:Django中models下常用Field以及字段参数

一、常见的FieldType数据库字段类型

1、AutoField:自增Field域,自动增加的一个数据库字段类型,例如id字段就可以使用该数据类型,参数中必须填入primary_key=True

2、BigAutoField:和AutoField相同,只是比AutoField要大,参数中必须填入primary_key=True

3、BigIntegerField:大整型,只要用于存储整型的数据

4、BinaryField:主要是存储原始的二进制数据

5、BooleanField:主要是存储布尔类型的数据,0和1

6、CharField:主要存储字符串的数据类型

7、DateField:主要存储日期类型的数据类型,日期格式为YYYY-MM-DD

8、DateTimeField:主要存储时间相关的数据类型,格式为YYYY-MM-DD HH:MM:[ss[.uuuuuu]][TZ]

注意:DateField与DateTimeField有两个属性,配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库,配置auto_now=True,每次更新数据记录的时候都会更新该字段

9、DecimalField:主要存储固定精度的十进制数据

--参数:max_digits(小数总长度)/decimal_places(小数位长度)

10、EmailField:存储电子邮件格式的数据,Django Admin以及ModelForm中提供验证机制

11、FileField:存储文件类型的数据,文件上传到指定目录

--参数:upload_to="...."(上传文件的保存路径)/storage=None(存储组件,默认django.core.files.storage.FileSystemStorage)

12、FilePathField:存储文件路径的数据,提供读取文件夹下文件的功能

--参数:path(文件夹路径)/match=None(正则匹配)/recursive=False(递归下面的文件夹)/allow_files=True(允许文件)/allow_folders=False(允许文件夹)

13、FloatField:存储浮点型数据

14、ImageField:存储图片型数据,文件上传到指定目录

--参数:upload_to="....."(上传文件的保存路径)/storage=None(存储组件,默认django.core.files.storage.FileSystemStorage)/width_field=None(上传图片的宽度保存的数据库字段名<字符串>)/height_field=None(上传图片的高度保存的数据库字段名<字符串>)

15、IntegerField:存储整型数据

16、GenericIPAddressField:存储IP地址信息数据

17、NullBooleanField:可以存储布尔值数据,也可以存储空null数据

18、PositiveIntegerField:主要存储正整数数据

19、SmallIntegerField:小整型,主要用于存储整型的数据

20、TextField:存储文章内容信息数据,存储比较长的文本信息

21、TimeField:存储时间信息

22、URLField:存储URL网址信息,Django Admin以及ModelForm中提供验证url

23、IPAddressField:Django Admin以及ModelForm中提供验证IPV4机制

24、GenericIPAddressField:Django Admin以及ModelForm中提供验证IPV4和IPV6机制

二、常用关系型数据表处理Field

1、处理一对多关系数据表:使用ForeignKey

2、处理多对多关系数据表:使用ManyToManyField

三、字段参数

1、null:用于表示某个字段可以为空

2、unique:如果设置为unique=True则该字段在此表中必须是唯一的

3、db_index:如果db_index=True则代表这为此字段设置索引

4、default:为该字段设置默认值

四、关系字段

1、to:设置要关联的表

2、to_field:设置要关联的表的字段

3、related_name:反向操作时,使用的字段名,用于代替原反向查询时的"表名_set"

4、on_delete:当删除关联表中的数据时,当前表与其关联的行的行为,例如删除一个出版社,那么和这个出版社有关联的书籍也都被删除掉了,下面介绍on_delete的参数值:

on_delete=models.CASCADE:删除关联数据,与之关联也删除

on_delete=models.DO_NOTHING:删除关联数据,引发错误IntegrityError

on_delete=models.PROTECT:删除关联数据,引发错误ProtectedError

on_delete=models.SET_NULL:删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)

on_delete=models.SET_DEFAULT:删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)

on_delete=models.SET:删除关联数据:

a、与之关联的值设置为指定值,设置:models.SET(值)

b、与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)

5、db_constraint:是否在数据库中创建外键约束,默认为True,db_constraint一般使用在建立数据表连接关系当中(例如创建外键),如果使用False,则是限制了表之间没有关联,达到了软连接的效果

五、元信息

ORM对应的类里面包含另一个Meta类,而Meta类封装了一些数据库的信息,主要字段如下:

1、db_table:ORM在数据库中的表名默认为app_类名,可以通过db_table可以重写表名

2、index_together:联合索引,给两列做索引

3、unique_together:联合唯一索引,两列不能重复

4、ordering:指定默认按什么字段顺序,只有设置了该属性,我们查询到的结果才可以被reverse()

具体介绍可以查看https://docs.djangoproject.com/en/dev/ref/models/fields/

以上这篇Django中的AutoField字段使用就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Django学习教程之静态文件的调用详解
May 08 Python
Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】
Dec 05 Python
python实现多层感知器
Jan 18 Python
python批量识别图片指定区域文字内容
Apr 30 Python
python实现批量视频分帧、保存视频帧
May 31 Python
Python定时从Mysql提取数据存入Redis的实现
May 03 Python
Keras-多输入多输出实例(多任务)
Jun 22 Python
Python Merge函数原理及用法解析
Sep 16 Python
详解numpy.ndarray.reshape()函数的参数问题
Oct 13 Python
Django自带用户认证系统使用方法解析
Nov 12 Python
Python性能测试工具Locust安装及使用
Dec 01 Python
python批量生成身份证号到Excel的两种方法实例
Jan 14 Python
jupyter notebook运行命令显示[*](解决办法)
May 18 #Python
jupyter notebook的安装与使用详解
May 18 #Python
Python读取JSON数据操作实例解析
May 18 #Python
基于django 的orm中非主键自增的实现方式
May 18 #Python
Mysql数据库反向生成Django里面的models指令方式
May 18 #Python
Jupyter notebook快速入门教程(推荐)
May 18 #Python
解决django 向mysql中写入中文字符出错的问题
May 18 #Python
You might like
用PHP将数据导入到Foxmail
2006/10/09 PHP
ThinkPHP登录功能的实现方法
2014/08/20 PHP
php使用post数组的键值创建同名变量并赋值的方法
2015/04/03 PHP
php 问卷调查结果统计
2015/10/08 PHP
PHP模板引擎Smarty之配置文件在模板变量中的使用方法示例
2016/04/11 PHP
PHP实现网页内容html标签补全和过滤的方法小结【2种方法】
2017/04/27 PHP
php经典趣味算法实例代码
2020/01/21 PHP
javascript编程起步(第二课)
2007/02/27 Javascript
javascript之querySelector和querySelectorAll使用介绍
2011/12/20 Javascript
jquery时间下拉框小例子
2013/04/15 Javascript
仿新浪微博登陆邮箱提示效果的js代码
2013/08/02 Javascript
JavaScrip常见的一些算法总结
2015/12/28 Javascript
Jquery基础之事件操作详解
2016/06/14 Javascript
AngularJs  E2E Testing 详解
2016/09/02 Javascript
[原创]JavaScript语法高亮插件highlight.js用法详解【附highlight.js本站下载】
2016/11/01 Javascript
B/S(Web)实时通讯解决方案分享
2017/04/06 Javascript
分享19个JavaScript 有用的简写写法
2017/07/07 Javascript
ReactNative 之FlatList使用及踩坑封装总结
2017/11/29 Javascript
vue实现todolist基本功能以及数据存储功能实例详解
2019/04/11 Javascript
js通过循环多张图片实现动画效果
2019/12/19 Javascript
JS实现简单的表格增删
2020/01/16 Javascript
Vue实现浏览器打印功能的代码
2020/04/17 Javascript
python使用Queue在多个子进程间交换数据的方法
2015/04/18 Python
Python实现Linux的find命令实例分享
2017/06/04 Python
python Opencv将图片转为字符画
2021/02/19 Python
numpy判断数值类型、过滤出数值型数据的方法
2018/06/09 Python
用python解压分析jar包实例
2020/01/16 Python
解决Keyerror ''acc'' KeyError: ''val_acc''问题
2020/06/18 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
2020/11/17 Python
波兰品牌鞋履在线商店:Eastend.pl
2020/01/11 全球购物
医院护士见习期自我鉴定
2014/04/10 职场文书
安全协议书
2014/04/23 职场文书
2014年无财产无子女离婚协议书范本
2014/10/09 职场文书
单位租房协议范本
2014/12/03 职场文书
营业员岗位职责
2015/02/11 职场文书
运动会3000米加油稿
2015/07/21 职场文书