如何将db_index = True添加到django auth_user的email字段中

时间:2015-06-12 12:37:30

标签: django django-models django-authentication

突然,我的页面在db中有这么多用户,因为用户数量极大,auth_user表上的电子邮件过滤器几乎失败了。

由于该表是内置的,我需要将db_index=True添加到此表中的列,任何想法如何执行此操作?

3 个答案:

答案 0 :(得分:4)

一种快速简便的方法是在迁移中使用RunSQL手动添加索引。

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

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

答案 1 :(得分:1)

一种可能性是将用户模型替换为自定义的模型,该模型具有适当的索引和您需要的任何其他字段。有关如何实现这一目标的Django docs: Substituting a custom User model有大量文档。这就是我在具有类似问题的特定情况下的做法。

另一种可能性是extend the user model,它可能具有从原始模型重复的特定字段,其上有索引。 免责声明:出于显而易见的原因,我真的反对这一点,但我已经看到了这种情况,因为这种方法比第一种方法更容易编码。如果有很多字段,这将是非常糟糕的。

这是一个很好的问题imo。我很想知道我是否还有其他可能性。

答案 2 :(得分:1)

我遇到了同样的问题,但还有一个问题 - 我已经在我的桌子上创建了一个由South创建的索引。因此,如果我在迁移中添加RunSQL("Create index"),它会向我的数据库添加第二个索引。但与此同时,如果我在迁移中不包含一些创建索引操作,那么我将无法正确启动新数据库。

这是我的解决方案,一些python代码,使用schema_editor

中的一些私有方法来检查是否存在索引

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)
    ]