Django auth:增加最大用户名长度

时间:2011-01-14 18:37:29

标签: django django-authentication

我需要将auth中的最大用户名大小增加到超过模型中定义的30个字符。 怎么做到呢?我不确定只是定制模型是正确或安全的方式。

4 个答案:

答案 0 :(得分:11)

这里的答案是一个有趣的方法: Can django's auth_user.username be varchar(75)? How could that be done?

覆盖User模型上max_length属性的小应用程序,但请注意,如果表格不是syncdb,则需要修改数据库列

我个人使用修剪过的哈希作为我的用户名,如果发生过极不可能的碰撞,会通知我,主题为“你刚赢了彩票!”

答案 1 :(得分:4)

为了满足未来需求,这是我发现的最佳方式:

https://github.com/GoodCloud/django-longer-username

答案 2 :(得分:2)

AFAIK,如果你想要那么你需要继承auth.user。一个更简单且不太冒险的解决方案可能是实现具有更长username字段的用户配置文件模型。为了避免冗余,您可以使用随机生成的数字填充实际username字段并使用它退出。

答案 3 :(得分:0)

我在我们现有的基础架构中遇到了这种需求。

我们的整个后端都依赖Django默认用户模型,但是我们需要更改此max_len以使其与电子邮件max_len相匹配。

在我所见的大多数StackOverflow帖子中,人们大多建议创建自定义用户模型。 在我们的案例中,这绝对是我们需要避免的事情。从默认的用户模型更改为自定义模型是对生产中成千上万用户执行的一项严肃而复杂的操作。

因此,我们只想直接将更改应用于数据库架构本身。 要正确执行此操作,最好的方法是从迁移中执行更改。 但是,我看不到一种直接为User模型生成迁移的方法。

我可以看到的一种方法是生成一个空的迁移,然后使用原始SQL执行迁移。

生成空迁移:

python manage.py makemigrations YOUR_APP --empty

编辑迁移:

# -*- coding: utf-8 -*-
# Generated by Django 1.10.6 on 2019-02-11 09:39
from __future__ import unicode_literals

from django.db import migrations, models
from django.db.models import F
from django.db.models.functions import Length

from pittsburgh.models import User

#
# This function fixes thee existing user records by applying setting their username to be their email
#
def forwards_func_username(apps, schema_editor):
    User.objects.annotate(email_len=Length('email')).filter(email_len__gte=30).update(username=F('email'))

#
# This function reverts back to the original state
# Users with email > 30 chars have their username being a truncated email
#
def reverse_func_username(apps, schema_editor):
    users = User.objects.annotate(email_len=Length('email')).filter(email_len__gte=30)

    for user in users:
        user.username = user.email[:30]
        user.save()

class Migration(migrations.Migration):

    dependencies = [
        ('pittsburgh', '0076_auto_20190205_1623'),
    ]

    operations = [
        # change username max_length from 30 to 75 to match email max max_length
        migrations.RunSQL(sql="ALTER TABLE auth_user MODIFY COLUMN username VARCHAR(75) NOT NULL;",
                          reverse_sql="ALTER TABLE auth_user MODIFY COLUMN username VARCHAR(30) NOT NULL;"),
        # update username to match email
        migrations.RunPython(forwards_func_username, reverse_func_username),
    ]

forwards_func_username中的reverse_func_usernameRunPython是可选的,取决于您愿意做什么。

请注意,RunSQL需要具有sqlparse依赖性,因此请不要忘记将其添加到requirements.txt文件中。

sqlparse==0.2.4 # used implicitly by Django Migrations engine when using RunSQL operation

希望有帮助,我花了两个小时浏览Web以获得一些好的解决方案,但这部分是Django严重欠佳的设计(例如,确实错过了Ruby on Rails上简洁易用的设计)。