You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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原生代码:

  1. 先在你自己的业务app下生成空迁移文件:
    python manage.py makemigrations your_business_app --empty
    
  2. 打开生成的空迁移文件,填充如下内容:
    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"),
            )
        ]
    
  3. 执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 23:24:04