Django使用settings.AUTH_USER_MODEL时如何为first_name、last_name创建索引
Django 为默认用户模型的name字段创建索引的优雅方案
前置说明
不管你是直接使用Django自带的auth.User还是已经自定义了AUTH_USER_MODEL,都可以用对应场景的无侵入式方案实现,不需要修改Django源码。
场景1:已自定义AUTH_USER_MODEL指向自研用户模型
直接在你的用户模型的Meta配置中声明索引即可:
from django.db import models from django.contrib.auth.models import AbstractUser class MyUser(AbstractUser): # 你的自定义字段 class Meta: # 其他Meta配置如db_table等 indexes = [ # 单独索引 models.Index(fields=["first_name"], name="auth_user_first_name_idx"), models.Index(fields=["last_name"], name="auth_user_last_name_idx"), # 若需要联合索引,替换为下面的写法即可 # models.Index(fields=["last_name", "first_name"], name="auth_user_fullname_idx") ]
修改完成后执行python manage.py makemigrations + python manage.py migrate,Django会自动在对应的表上创建索引,默认使用的schema就是你配置的public。
场景2:直接使用Django默认的auth.User未做自定义
通过新增独立迁移文件的方式添加索引,不会侵入Django原生代码:
- 先在你自己的业务app下生成空迁移文件:
python manage.py makemigrations your_business_app --empty - 打开生成的空迁移文件,填充如下内容:
from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ # 这里替换为你本地auth app的最新迁移版本,示例用的是Django 4.x的最新auth迁移版本 ("auth", "0012_alter_user_first_name_max_length"), # 这里替换为你的业务app当前迁移的依赖版本 ("your_business_app", "0001_initial"), ] operations = [ migrations.AddIndex( model_name="user", index=models.Index(fields=["first_name"], name="auth_user_first_name_idx"), ), migrations.AddIndex( model_name="user", index=models.Index(fields=["last_name"], name="auth_user_last_name_idx"), ) ] - 执行
python manage.py migrate即可完成索引创建。
特殊需求扩展
如果你需要创建大小写不敏感的模糊查询索引,可直接用RunSQL执行原生SQL实现,示例:
# 把下面的代码加到迁移的operations列表里即可 migrations.RunSQL( sql="CREATE INDEX auth_user_first_name_lower_idx ON public.auth_user (lower(first_name));", reverse_sql="DROP INDEX IF EXISTS auth_user_first_name_lower_idx;" )
内容的提问来源于stack exchange,提问作者Ryabchenko Alexander
相关产品推荐
相关产品推荐

