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 相关文章推荐
python实现合并两个数组的方法
May 16 Python
在Python中操作时间之mktime()方法的使用教程
May 22 Python
Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享
Jul 04 Python
Python实现的异步代理爬虫及代理池
Mar 17 Python
pycham查看程序执行的时间方法
Nov 29 Python
Python2和Python3之间的str处理方式导致乱码的讲解
Jan 03 Python
python实现维吉尼亚加密法
Mar 20 Python
Python for循环与range函数的使用详解
Mar 23 Python
Python求离散序列导数的示例
Jul 10 Python
Django ORM多对多查询方法(自定义第三张表&amp;ManyToManyField)
Aug 09 Python
Python生态圈图像格式转换问题(推荐)
Dec 02 Python
Python return语句如何实现结果返回调用
Oct 15 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 图像函数大举例(非原创)
2009/06/20 PHP
php下删除一篇文章生成的多个静态页面
2010/08/08 PHP
php+mysql删除指定编号员工信息的方法
2015/01/14 PHP
使用ltrace工具跟踪PHP库函数调用的方法
2016/04/25 PHP
使用laravel的migrate创建数据表的方法
2019/09/30 PHP
非阻塞动态加载javascript广告实现代码
2010/11/17 Javascript
使用jquery实现图文切换效果另加特效
2013/01/20 Javascript
Extjs中ComboBoxTree实现的下拉框树效果(自写)
2013/05/28 Javascript
JS取request值以及自动执行使用示例
2014/02/24 Javascript
JavaScript中实现异步编程模式的4种方法
2014/09/24 Javascript
drag-and-drop实现图片浏览器预览
2015/08/06 Javascript
jquery实现多条件筛选特效代码分享
2015/08/28 Javascript
js简单倒计时实现代码
2016/04/30 Javascript
解析JavaScript实现DDoS攻击原理与保护措施
2016/12/26 Javascript
各种选择框jQuery的选中方法(实例讲解)
2017/06/27 jQuery
vue2.0 实现页面导航提示引导的方法
2018/03/13 Javascript
vue动态配置模板 'component is'代码
2019/07/04 Javascript
vue项目中使用AES实现密码加密解密(ECB和CBC两种模式)
2019/08/12 Javascript
Vue 数组和对象更新,但是页面没有刷新的解决方式
2019/11/09 Javascript
node.js中Buffer缓冲器的原理与使用方法分析
2019/11/23 Javascript
[02:37]TI8勇士令状不朽珍藏II视频展示
2018/06/23 DOTA
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
Python中最常用的操作列表的几种方法归纳
2015/04/24 Python
python爬取各类文档方法归类汇总
2018/03/22 Python
Python实现Restful API的例子
2019/08/31 Python
Python 寻找局部最高点的实现
2019/12/05 Python
python可迭代对象去重实例
2020/05/15 Python
Python检测端口IP字符串是否合法
2020/06/05 Python
python对批量WAV音频进行等长分割的方法实现
2020/09/25 Python
同步和异步有何异同,在什么情况下分别使用他们
2013/04/09 面试题
集体婚礼策划方案
2014/02/22 职场文书
代办委托书怎样写
2014/04/08 职场文书
2014年教师党员自我评价范文
2014/09/22 职场文书
预备党员期盼十八届四中全会召开思想汇报
2014/10/17 职场文书
迎国庆主题班会
2015/08/17 职场文书
PO模式在selenium自动化测试框架的优势
2022/03/20 Python