在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 (...)
答案 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