Django自定义Model索引顺序与联合索引设置指南

认真发呆
认真发呆
发布时间:2026-10-13| 6人浏览过
原创

本文详解Django中如何控制Model创建的数据库索引顺序,特别是涉及ForeignKey时的处理技巧。同时介绍联合约束unique_together与联合索引index_together的配置方法,通过具体案例说明联合索引在大数据量查询中的性能优势及SQL执行逻辑。

Django Model索引顺序控制技巧

这涉及一个先有鸡还是先有蛋的问题。通常情况下,数据来源于Excel整理,随着数据量增加和分析维度增多,仅靠Excel管理变得吃力。

此时需将Excel数据导入数据库。然而,Django Model创建的索引顺序并非完全由编写顺序决定,特别是存在models.ForeignKey时,必须先创建被引用的ForeignKey类,最后再创建总表。

为确保数据库索引顺序与Excel中的索引保持一致,需要对Model中的索引字段进行特殊处理(这可能是一种非标准做法)。

首先需创建ForeignKey对应的类,该类定义必须写在前面,否则总表类在引用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联合约束与联合索引配置

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

在Django Model中,可对单表的多个字段进行联合约束和联合索引设置。例如在购物车表中,登录用户ID与商品ID组合表示一条唯一记录。

具体示例如下:

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%的过滤(1000万 * 10% * 10% * 10%),直接得到一万条数据,效率更高。

建立联合索引的同时,数据库还会为字段间的组合建立索引。

以上内容为本文核心要点,希望对读者学习有所帮助,欢迎支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。