突然,我的页面在db中有这么多用户,因为用户数量极大,auth_user
表上的电子邮件过滤器几乎失败了。
由于该表是内置的,我需要将db_index=True
添加到此表中的列,任何想法如何执行此操作?
答案 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)
]