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 相关文章推荐
Python下的subprocess模块的入门指引
Apr 16 Python
深入源码解析Python中的对象与类型
Dec 11 Python
浅谈Python 集合(set)类型的操作——并交差
Jun 30 Python
深入理解NumPy简明教程---数组2
Dec 17 Python
关于Python数据结构中字典的心得
Dec 04 Python
Python装饰器模式定义与用法分析
Aug 06 Python
Python SQL查询并生成json文件操作示例
Aug 17 Python
python使用for循环计算0-100的整数的和方法
Feb 01 Python
使用Python做垃圾分类的原理及实例代码附源码
Jul 02 Python
python SVM 线性分类模型的实现
Jul 19 Python
Python+pyftpdlib实现局域网文件互传
Aug 24 Python
python字典按照value排序方法
Dec 28 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
phpinfo()中Loaded Configuration File(none)的解决方法
2017/01/16 PHP
ThinkPHP框架分布式数据库连接方法详解
2017/03/14 PHP
php实现大文件断点续传下载实例代码
2019/10/01 PHP
javascript add event remove event
2008/04/07 Javascript
JQuery验证工具类搜集整理
2013/01/16 Javascript
js同比例缩放图片的小例子
2013/10/30 Javascript
smartcrop.js智能图片裁剪库
2015/10/14 Javascript
jquery可定制的在线UEditor编辑器
2015/11/17 Javascript
jQuery实现为控件添加水印文字效果(附源码)
2015/12/02 Javascript
探索Vue.js component内容实现
2016/11/03 Javascript
javascript数据结构中栈的应用之符号平衡问题
2017/04/11 Javascript
Vue微信项目按需授权登录策略实践思路详解
2018/05/07 Javascript
vue2.0 中使用transition实现动画效果使用心得
2018/08/13 Javascript
微信小程序用户信息encryptedData详解
2018/08/24 Javascript
vue项目设置scrollTop不起作用(总结)
2018/12/21 Javascript
微信小程序导航栏跟随滑动效果的实现代码
2019/05/14 Javascript
webpack DllPlugin xxx is not defined解决办法
2019/12/13 Javascript
微信小程序getLocation 需要在app.json中声明permission字段
2020/03/03 Javascript
微信小程序实现手指拖动选项排序
2020/04/22 Javascript
antd vue table跨行合并单元格,并且自定义内容实例
2020/10/28 Javascript
[05:09]第二届DOTA2亚洲邀请赛决赛日比赛集锦:iG 3:0 OG夺冠
2017/04/05 DOTA
Python使用PyCrypto实现AES加密功能示例
2017/05/22 Python
Centos7 Python3下安装scrapy的详细步骤
2018/03/15 Python
python统计多维数组的行数和列数实例
2018/06/23 Python
Python 类,property属性(简化属性的操作),@property,property()用法示例
2019/10/12 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
2019/11/28 Python
python 经典数字滤波实例
2019/12/16 Python
Python如何在windows环境安装pip及rarfile
2020/06/15 Python
Tensorflow之MNIST CNN实现并保存、加载模型
2020/06/17 Python
python re的findall和finditer的区别详解
2020/11/15 Python
HTML5中视频音频的使用详解
2017/07/07 HTML / CSS
赫里福德的一家乡村零售商店:Philip Morris & Son
2017/06/25 全球购物
Spartoo西班牙官网:法国时尚购物网站
2018/03/27 全球购物
会计应届生的自荐信
2013/12/13 职场文书
元旦晚会感言
2014/03/12 职场文书
Go web入门Go pongo2模板引擎
2022/05/20 Golang