Django model user create index for first_name, last_name

Я использую settings.AUTH_USER_MODEL в качестве модели пользователя по умолчанию

И я хочу создать индекс на

public.auth_user.first_name
public.auth_user.last_name

Есть ли какой-нибудь элегантный способ создания этих индексов?

Вы можете сделать это, указав другую User модель. Просто наследуя от AbstractUser [Django-doc] и указывая индексы:

# app_name/models.py

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    first_name = models.CharField(_('first name'), max_length=150, db_index=True, blank=True)
    last_name = models.CharField(_('last name'), max_length=150, db_index=True, blank=True)
    
    class Meta(AbstractUser.Meta):
        swappable = 'AUTH_USER_MODEL'

тогда вы можете указать модель пользователя для ссылки на модель User в модуле app_name:

# settings.py

# ⋮

AUTH_USER_MODEL = 'app_name.User'

# ⋮

Немного уродливый, но все же элегантный способ: Создайте необработанную SQL-миграцию, создав индекс.

Первый

pip3 install django-migrate-sql-deux

Тогда

import migrate_sql.operations

from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):
    dependencies = [
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
        ('my_app', '0094_last_migration_name')
    ]
    operations = [
        migrate_sql.operations.CreateSQL(
            name='auth_user_first_name_idx',
            sql='create index auth_user_first_name_idx on auth_user (first_name)',
            reverse_sql='drop index auth_user_first_name_idx',
        ),
        migrate_sql.operations.CreateSQL(
            name='auth_user_last_name_idx',
            sql='create index auth_user_last_name_idx on auth_user (last_name)',
            reverse_sql='drop index auth_user_last_name_idx',
        ),
    ]
Вернуться на верх