如何将db_index=True添加到django auth_用户的电子邮件字段

如何将db_index=True添加到django auth_用户的电子邮件字段,django,django-models,django-authentication,Django,Django Models,Django Authentication,突然,我的页面在db中获得了如此多的用户,以至于通过auth_user表过滤电子邮件几乎失败,因为用户数量非常多 由于该表是内置的,因此我需要将db_index=True添加到此表中的列,您知道如何做到这一点吗 一种可能性是用自定义模型替换用户模型,该模型将具有适当的索引和您需要的任何其他字段。关于如何实现这一点,有大量的文档。这就是我在一个有类似问题的特殊案例中所做的 另一种可能性是,它可以从原始模型中重复一个特定字段,该字段上有一个索引。免责声明:出于显而易见的原因,我真诚地反对这种做法,但

突然,我的页面在db中获得了如此多的用户,以至于通过
auth_user
表过滤电子邮件几乎失败,因为用户数量非常多


由于该表是内置的,因此我需要将
db_index=True
添加到此表中的列,您知道如何做到这一点吗

一种可能性是用自定义模型替换用户模型,该模型将具有适当的索引和您需要的任何其他字段。关于如何实现这一点,有大量的文档。这就是我在一个有类似问题的特殊案例中所做的

另一种可能性是,它可以从原始模型中重复一个特定字段,该字段上有一个索引。免责声明:出于显而易见的原因,我真诚地反对这种做法,但我看到了这种情况的发生,因为这种方法比第一种更容易编码。如果有很多领域,这将是非常糟糕的


在我看来,这是一个很好的问题。我很想知道是否还有我错过的另一种可能性。

一种简单快捷的方法是在迁移过程中使用
RunSQL
手动添加索引

operations = [
    migrations.RunSQL("CREATE INDEX..."),
]

不太优雅。首先,迁移将针对不同的应用程序(因为您不控制
auth
迁移)。另一方面,从技术上讲,模式将与数据库不同步。然而,我不认为在这种情况下会有任何负面的后果,因为Django除了创建索引之外,对db_index做任何事情。

我也有同样的问题,但还有一个额外的问题——我的表中已经有了South创建的索引。因此,如果我在迁移中添加一个
RunSQL(“创建索引”)
,它将向数据库添加第二个索引。但同时,如果我在迁移中不包括一些创建索引操作,那么我将无法正确地启动新数据库

这是我的解决方案,一些python代码使用
schema\u编辑器中的一些私有ish方法检查索引是否存在

project/appname/migrations/0002.py

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations
from django.db.migrations import RunPython


def forward__auth_user__email__index(apps, schema_editor):
    auth_user = apps.get_model("auth", "User")
    target_column_to_index = 'email'
    se = schema_editor

    # if there aren't any indexes already, create one.
    index_names = se._constraint_names(auth_user, [target_column_to_index], index=True)
    if len(index_names) == 0:
        se.execute(se._create_index_sql(auth_user, [auth_user._meta.get_field('email')]))

def reverse__auth_user__email__index(apps, schema_editor):
    auth_user = apps.get_model("auth", "User")
    target_column_to_index = 'email'
    se = schema_editor

    # delete any indexes for this table / column.
    index_names = se._constraint_names(model, [target_column_to_index], index=True)
    for index_name in index_names:
        se.execute(se._delete_constraint_sql(se.sql_delete_index, auth_user, index_name))


class Migration(migrations.Migration):

    dependencies = [
        ('frontend', '0001_initial'),
    ]

    operations = [
        RunPython(forward__auth_user__email__index, reverse_code=reverse__auth_user__email__index)
    ]

谢谢,上面的技术我很熟悉,但是我想有一些不需要换桌子的方法。。因为我的桌子现在太大了,我宁愿不碰它的结构。。但我会继续寻找更好的解决方案。。让我们听听别人怎么想;)欢迎光临,我以为您会很熟悉,但我会保留答案以备记录。更简单的解决方案是创建RunSQL迁移,然后将其假应用(请参阅)到现有数据库。当然,我的解决方案是编写更多代码,但您的解决方案需要更多的操作工作,并且有机会进行横向迁移。这是偏好的问题。