при расширении модели пользователя Django методы класса не найдены - PullRequest
0 голосов
/ 28 июня 2018

В Django 2.0, python 3.6.5 в Ubuntu:

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 голосов
/ 28 июня 2018

Метод происходит от AbstractUser:

class AbstractBaseUser(models.Model):

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

Это логично, поскольку, если бы каждая функция, определенная в классе, просто была бы доступна по имени, это привело бы к совершенно нестабильному коду. Представьте, что вы создаете функцию send_email, и вдруг ваш коллега также создает такую ​​функцию в другом классе, тогда какую функцию следует использовать?

Python позволяет писать функции в файле (следовательно, модуле), которые не привязаны к определенному классу, но тогда вам все равно нужно убедиться, какой из них вам нужен. Хороший язык программирования - однозначный , конечно, на уровне синтаксиса, но также в случае вызова функции должно быть понятно, какая функция вызывается.

Но вы можете сделать это более удобным, импортировав сам класс. Например:

from django.contrib.auth.models import <b>User</b>

class UserProxy (<b>User</b>):

    foo = <b>User</b>.normalize_username ('abc') # OK
    bar = <b>User</b>.normalize_username ('abc') # OK

    class Meta:
        proxy = True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...