扩展Django用户模型时找不到类方法

时间:2018-06-28 13:47:02

标签: python django inheritance class-method django-users

在Django 2.0中,Ubuntu上的python 3.6.5:

class UserProxy (django.contrib.auth.models.User):

    foo = django.contrib.auth.models.User.normalize_username ('abc') # OK
    bar =                                 normalize_username ('abc') # ERROR

    class Meta:
        proxy = True

bar=行抛出此异常:

NameError: name 'normalize_username' is not defined

为什么在没有显式命名空间的情况下该方法不可见?

UserProxy.objects.create_user内部引发了相同的错误,该错误期望self.model.normalize_username存在。这是在数据库迁移期间发生的

def commit (apps, schema_editor):
    apps.get_model ('myapp', 'UserProxy').objects.create_user (...)

1 个答案:

答案 0 :(得分:0)

该方法起源于AbstractUser

class AbstractBaseUser(models.Model):

    @classmethod
    def normalize_username(cls, username):
        return unicodedata.normalize('NFKC', force_text(username))

这是合乎逻辑的,因为如果名称上的每个函数都可以通过名称简单地访问,则将导致代码完全不稳定。想象一下,您创建了一个函数send_email,突然之间,您的同事也在另一个类中创建了该函数,那么应该使用哪个函数?

Python允许在文件(因此模块)中编写不受特定类限制的函数,但是您仍然需要确定要使用哪个函数。好的编程语言是明确,当然在语法级别上也是这样,但是如果调用了函数,则应清楚地调用了哪个函数。

但是,您可以通过导入类本身来使其更加方便。例如:

from django.contrib.auth.models import User

class UserProxy (User):

    foo = User.normalize_username ('abc') # OK
    bar = User.normalize_username ('abc') # OK

    class Meta:
        proxy = True