Django如何自定义model创建数据库索引的顺序


Posted in Python onJune 20, 2019

首先这是一个先有鸡还是先有蛋的问题,大部分时候数据都来自excel的整理,当数据越来越多,需要分析的点也越来越多的时候,通过excel来管理显然有些吃力了。

这时候就需要将excel导入到数据库中,然而model创建的索引并非是我们编写时候的顺序,特别是当存在 models.ForeignKey 时,我们必须要先创建 ForeignKey的class,最后再创建总表。

为了保证数据库的索引跟excel的索引一致,我们需要对model中的索引字段做一系列的处理(可能这是一个野路子)。

首先当然是先创建好ForeignKey,这部分class要写在前面,否则总表的class对于引用的ForeignKey会提示未定义(这部分不做举例)。

接下来创建总表,此时不要着急去填写总表中的索引字段,只先创建这个总表的表头,如下图:

@python_2_unicode_compatible
class ZZ_Demo(models.Model): #此处的ZZ开头的命名是为了让这个class在最后创建
######中间什么都不要写######
 class Meta:
 verbose_name = '这是个Demo'
 verbose_name_plural = '这是个Demo' #这些是在Django admin里显示的 可忽略

 def __str__(self):
 return self.name

然后在终端执行:

python manage.py makemigrations
python manage.py migrate

这个过程会看到系统在创建数据表。

创建好以后再添加总表中的索引字段,首先可以肯定的是model是按照字母顺序创建索引的,如果没有其他的models.ForeignKey,可以直接通过字母顺序来控制索引的创建顺序,如下图所示:

@python_2_unicode_compatible
class ZZ_Demo(models.Model):
 ab_productline = models.ForeignKey(ProductLine, verbose_name=u'产品线',default=1,null=True)
 ac_name = models.CharField(max_length=50, verbose_name = u'故障名称',null=True)
 ......
 bn_casetags = models.CharField(max_length=50, verbose_name = u'关键词 标签 备注',default=None,blank=True,null=True)

 class Meta:
 verbose_name = '这是个Demo'
 verbose_name_plural = '这是个Demo'

 def __str__(self):
 return self.be_casenumber

这样创建好的索引就完全是字母顺序排列了,小伙伴们可以试试看。

Django model 中设置联合约束和联合索引

在Django model中对一张表的几个字段进行联合约束和联合索引,例如在购物车表中,登录的用户和商品两个字段在一起表示唯一记录。

举个栗子:

Django model中购物车表

class Cart(models.Model):
 user = models.ForeignKey(
 MyUser,
 verbose_name="用户"
 )
 goods = models.ForeignKey(
 Goods,
 verbose_name="商品"
 )
 num = models.IntegerField(
 verbose_name="商品数量"
 )
 is_select = models.BooleanField(
 default=True,
 verbose_name="选中状态"
 )
 
 class Meta:
 # 联合约束 其中goods和user不能重复
 unique_together = ["goods", "user"]
 # 联合索引
 index_together = ["user", "goods"]

unique_together = ["goods", "user"]  表示联合约束,其中"goods"和"user"表示不能重复,不能一样。

index_together = ["user", "goods"] 表示联合索引,其中"goods"和"user"联合同步查询,提高效率。

联合索引的优势

示例SQL:select * from person where a=100 and b=100 and c=1000;

​ 假设你的数据有一千万条 每次条件过滤 省10%的数据

​ 1 如果三个单索引 先拿a的索引找 剩下100万数据 然后拿b条件找 剩十万 再c条件找 最后得到一万数据

​ 2 如果是联合索引 他 一千万数据*10% * 10% * 10% 直接得到一万条数据

​ 建立联合索引的同时 还会给他们之间的组合建立索引

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Django1.7+python 2.78+pycharm配置mysql数据库
Oct 09 Python
Python 序列的方法总结
Oct 18 Python
python3.4用循环往mysql5.7中写数据并输出的实现方法
Jun 20 Python
python使用super()出现错误解决办法
Aug 14 Python
django框架之cookie/session的使用示例(小结)
Oct 15 Python
python的concat等多种用法详解
Nov 28 Python
django之对FileField字段的upload_to的设定方法
Jul 28 Python
Python 实例方法、类方法、静态方法的区别与作用
Aug 14 Python
让你的Python代码实现类型提示功能
Nov 19 Python
Python网络爬虫四大选择器用法原理总结
Jun 01 Python
详解向scrapy中的spider传递参数的几种方法(2种)
Sep 28 Python
Python 带星号(* 或 **)的函数参数详解
Feb 23 Python
pyqt 多窗口之间的相互调用方法
Jun 19 #Python
pyqt5 实现多窗口跳转的方法
Jun 19 #Python
快速解决pyqt5窗体关闭后子线程不同时退出的问题
Jun 19 #Python
Pyqt5 实现跳转界面并关闭当前界面的方法
Jun 19 #Python
pyqt5使用按钮进行界面的跳转方法
Jun 19 #Python
Python发展史及网络爬虫
Jun 19 #Python
Python QQBot库的QQ聊天机器人
Jun 19 #Python
You might like
php的GD库imagettftext函数解决中文乱码问题
2015/01/24 PHP
php实现将数据做成json的格式给前端使用
2018/08/21 PHP
PHP常见过waf webshell以及最简单的检测方法
2019/05/21 PHP
jquery弹出框的用法示例(2)
2013/08/26 Javascript
JS对文本框值的判断示例
2014/03/10 Javascript
原生的html元素选择器类似jquery选择器
2014/10/15 Javascript
JavaScript中对象property的读取和写入方法介绍
2014/12/30 Javascript
2则自己编写的jQuery特效分享
2015/02/26 Javascript
js兼容火狐获取图片宽和高的方法
2015/05/21 Javascript
JavaScript实现为input与textarea自定义hover,focus效果的方法
2015/08/21 Javascript
javascript跨域的方法汇总
2015/10/23 Javascript
js仿百度登录页实现拖动窗口效果
2016/03/11 Javascript
浅析JavaScript回调函数应用
2016/05/22 Javascript
关于JavaScript数组你所不知道的3件事
2016/08/24 Javascript
jQuery实现的自定义滚动条实例详解
2016/09/20 Javascript
探索Vue.js component内容实现
2016/11/03 Javascript
Vue.js的复用组件开发流程完整记录
2018/11/29 Javascript
微信小程序解除10个请求并发限制
2018/12/18 Javascript
Vue中CSS动画原理的实现
2019/02/13 Javascript
vue+高德地图写地图选址组件的方法
2019/05/18 Javascript
深入理解令牌认证机制(token)
2019/08/22 Javascript
[01:06]欢迎来到上海,TI9
2018/08/26 DOTA
Python、PyCharm安装及使用方法(Mac版)详解
2017/04/28 Python
python邮件发送smtplib使用详解
2020/06/16 Python
Python3.8中使用f-strings调试
2019/05/22 Python
pandas 时间格式转换的实现
2019/07/06 Python
python爬虫 基于requests模块的get请求实现详解
2019/08/20 Python
Python 线程池用法简单示例
2019/10/02 Python
Python列表倒序输出及其效率详解
2020/03/04 Python
如何更换python默认编辑器的背景色
2020/08/10 Python
CSS3模块的目前的状况分析
2010/02/24 HTML / CSS
加拿大城市本地限时优惠:Buytopia.ca
2018/09/19 全球购物
个人房屋租赁合同(标准范本)
2019/09/16 职场文书
高一作文之暖冬
2019/11/09 职场文书
golang实现一个简单的websocket聊天室功能
2021/10/05 Golang
Python实现日志实时监测的示例详解
2022/04/06 Python