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

作者:628 财经 时间:2024-01-24 23:14:40 

首先这是一个先有鸡还是先有蛋的问题,大部分时候数据都来自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% 直接得到一万条数据

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

来源:https://www.000628.com/node/198

标签:Django,model,索引,顺序
0
投稿

猜你喜欢

  • Go语言的反射机制详解

    2024-05-09 14:58:51
  • 浅谈pytorch中的nn.Sequential(*net[3: 5])是啥意思

    2023-10-05 05:42:55
  • ASP中使用Set ors=oConn.Execute()时获取记录数的方法

    2011-02-20 10:48:00
  • python3实现带多张图片、附件的邮件发送

    2023-05-11 06:51:10
  • SQL Server 2008的一些新特点及独到之处

    2009-01-15 12:59:00
  • python3实现Dijkstra算法最短路径的实现

    2023-10-14 13:17:40
  • Python使用pandas导入csv文件内容的示例代码

    2022-07-25 15:34:16
  • python深度学习之多标签分类器及pytorch实现源码

    2022-09-26 01:09:12
  • 详解Golang中Context的原理和使用技巧

    2024-05-22 10:30:05
  • 一文详解Golang中的切片数据类型

    2024-02-12 18:04:19
  • 对python中的xlsxwriter库简单分析

    2022-08-22 22:46:01
  • python处理csv数据动态显示曲线实例代码

    2022-05-01 00:35:05
  • 用Python的Django框架编写从Google Adsense中获得报表的应用

    2022-10-01 13:20:07
  • python开发入门——set的使用

    2023-09-21 09:39:56
  • python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法

    2021-01-03 05:25:29
  • 在EF中使用MySQL的方法及常见问题

    2024-01-28 11:22:03
  • mysql8.0.23 msi安装超详细教程

    2024-01-22 13:44:14
  • Python实现的绘制三维双螺旋线图形功能示例

    2023-02-21 20:37:15
  • 安装sql server 2008时的4个常见错误和解决方法

    2024-01-22 10:24:58
  • pycharm 批量修改变量名称的方法

    2021-09-07 22:48:29
  • asp之家 网络编程 m.aspxhome.com