当前位置: 首页 > 面试题库 >

django的auth_user.username可以为varchar(75)吗?那怎么办?

谯嘉木
2023-03-14
问题内容

这有什么错上运行ALTER TABLE auth_userusernamevarchar(75)因此它可以适应的电子邮件?那有什么坏处呢?

如果要更改auth_user.username为在varchar(75)哪里,则需要修改django?将源代码中的30更改为75仅仅是一个问题吗?

username = models.CharField(_('username'), max_length=30, unique=True, help_text=_("Required. 30 characters or fewer. Letters, numbers and @/./+/-/_ characters"))

还是在此字段上还有其他需要更改的验证,或对此有其他影响?

有关执行此操作的原因,请参见下面与Bartek的评论讨论。

编辑:几个月后回首。对于不知道前提的任何人:某些应用程序不需要或不希望使用用户名,它们仅使用电子邮件进行注册和身份验证。不幸的是,在django auth.contrib中,需要用户名。你可以开始在用户名字段中放入电子邮件,但是该字段只有30个字符,现实世界中电子邮件可能很长。可能比此处建议的75个字符更长,但75个字符可容纳大多数理智的电子邮件地址。问题是针对这种情况的,这是基于电子邮件验证的应用程序所遇到的。


问题答案:

有一种方法可以在不接触核心模型且没有继承的情况下实现这一目标,但这绝对是hackish,我会格外小心地使用它。

如果你查看Django的关于 signal的文档,你会看到有一个名为的文档class_prepared,该文档基本上是在元类创建了任何实际的模型类之后发送的。那一刻是你修改任何型号的最后机会之前,任何神奇的发生(即:ModelFormModelAdminsyncdb,等…)。

因此,该计划很简单,你只需向处理程序注册该信号,该处理程序将检测何时为User模型调用该信号,然后更改max_lengthusername字段的属性。

现在的问题是,该代码应该放在哪里?它必须在User加载模型之前执行,因此通常意味着很早。不幸的是,你不能(django 1.1.1,没有检查其他版本)将其放进去,settings因为在signals那儿导入会损坏东西。

更好的选择是将其放在虚拟应用程序的“模型”模块中,并将该应用程序放在INSTALLED_APPS列表/元组的顶部(这样就可以先导入它)。这是你可以拥有的示例myhackishfix_app/models.py

from django.db.models.signals import class_prepared

def longer_username(sender, *args, **kwargs):
    # You can't just do `if sender == django.contrib.auth.models.User`
    # because you would have to import the model
    # You have to test using __name__ and __module__
    if sender.__name__ == "User" and sender.__module__ == "django.contrib.auth.models":
        sender._meta.get_field("username").max_length = 75

class_prepared.connect(longer_username)

这样就可以了。

一些注意事项:

  • 你可能还想更改help_text字段的,以反映新的最大长度
  • 如果要使用自动admin,则必须子类化UserChangeForm,UserCreationForm并且AuthenticationForm最大长度不是从model字段推导出的,而是直接在form字段声明中推导出的。
    如果使用South,则可以创建以下迁移来更改基础数据库中的列:
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models

class Migration(SchemaMigration):

    def forwards(self, orm):

        # Changing field 'User.username'
        db.alter_column('auth_user', 'username', models.CharField(max_length=75))


    def backwards(self, orm):

        # Changing field 'User.username'
        db.alter_column('auth_user', 'username', models.CharField(max_length=35))


    models = { 

# ... Copy the remainder of the file from the previous migration, being sure 
# to change the value for auth.user / usename / maxlength


 类似资料:
  • 问题内容: 我有一个用于存储优惠券/折扣的表,并且我想将coupon_code列用作主键,即。 我的理由是,每个优惠券都将具有唯一的代码,而我将要运行的唯一命令是 我不会进行任何联接或索引编制,并且我看不到该表中有超过几百个条目。 在我看来,这可以,但是我不知道是否有任何我想念的东西。 问题答案: 从某种意义上说,您当然可以,您的RDBMS将允许您这样做。这个问题的答案,你是否没有问题 应该 做到

  • 本文向大家介绍topic的分区数可不可以增加?如果可以怎么增加?如果不可以,那又是为什么?相关面试题,主要包含被问及topic的分区数可不可以增加?如果可以怎么增加?如果不可以,那又是为什么?时的应答技巧和注意事项,需要的朋友参考一下 可以增加 bin/kafka-topics.sh --zookeeper localhost:2181/kafka --alter --topic topic-co

  • 本文向大家介绍topic的分区数可不可以减少?如果可以怎么减少?如果不可以,那又是为什么?相关面试题,主要包含被问及topic的分区数可不可以减少?如果可以怎么减少?如果不可以,那又是为什么?时的应答技巧和注意事项,需要的朋友参考一下 不可以减少,被删除的分区数据难以处理。

  • 上述URL中的title可以默认为空吗,例如可传可不传!

  • 一、纯本地App 没任何服务请求,已经有开发好的一堆html+js,希望本地App中可以方便的使用,那可以参考默认的Native/X5工程,把自己开发好的资源放到www目录下就可以,注意工程的几个重要选项: 服务地址:http://localhost 首页: 假设你www中有一个入口的index.html,那写 /index.html 生成App包的向导中,“重新编译使用到的UI资源”一定不要选

  • 一、纯本地App 没任何服务请求,已经有开发好的一堆html+js,希望本地App中可以方便的使用,那可以参考默认的Native/X5工程,把自己开发好的资源放到www目录下就可以,注意工程的几个重要选项: 服务地址:http://localhost 首页: 假设你www中有一个入口的index.html,那写 /index.html 生成App包的向导中,“重新编译使用到的UI资源”一定不要选