Почему у начальной миграции есть зависимости? - PullRequest
0 голосов
/ 28 июня 2018

Без каких-либо предварительных миграций я добавил пользовательскую модель Пользователь в core приложение, чтобы включить пользовательскую аутентификацию, следуя записи в документации Django 2.0 / Настройка аутентификации в Django

Затем я сделал миграции:

$ python manage.py makemigrations

Migrations for 'core':
  core/migrations/0001_initial.py
    - Create model User

В 0001_initial.py класс миграции начинается с:

class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ('auth', '0009_alter_user_last_name_max_length'),
    ]

Я просмотрел официальную документацию Django 2.0 / Миграции , и этот файл, очевидно, является начальной миграцией, поскольку он имеет initial = True. Но почему у него есть целая цепочка зависимостей, начинающаяся с 0009_alter_user_last_name_max_length? Я сделал какую-то ошибку?

Когда выполняются миграции, это вывод:

$ python manage.py migrate  
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, core, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0001_initial... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying core.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying sessions.0001_initial... OK

Когда пользовательский Пользователь модель не указана 0001_initial.py начинается с:

class Migration(migrations.Migration):

    initial = True

    dependencies = [
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

Кроме того, я не смог найти хорошее объяснение того, что именно делает migrations.swappable_dependency(settings.AUTH_USER_MODEL). Что он делает и почему его даже называют «swappable_dependency»? Было бы замечательно, если бы кто-то мог демистифицировать эту часть и для меня, или указать правильное направление для самостоятельного изучения. ?

Редактировать # 1

Исходный код пользовательской Пользовательской модели.

class UserManager(BaseUserManager):
    def create_user(self, email, password=None):
        if not email:
            raise ValueError('Email not defined.')

        user = self.model(email=self.normalize_email(email))

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password):
        user = self.create_user(
            email,
            password=password,
        )
        user.is_staff = True
        user.save(using=self._db)
        return user


class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True)
    created_at = models.DateTimeField(auto_now_add=True)
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)

    EMAIL_FIELD = 'email'
    USERNAME_FIELD = 'email'

    objects = UserManager()

    def __str__(self):
        return self.email

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_label):
        return True

1 Ответ

0 голосов
/ 29 июня 2018

Это нормальное и ожидаемое поведение - вам все еще нужно перенести миграцию из django.contrib.auth в вашу базу данных.

Если вы посмотрите на эти миграции , они включают в себя различные другие модели, необходимые для приложения аутентификации - такие как Permission и Group. Модель User имеет поля, которые ссылаются на эти другие модели, поэтому вам нужно выполнить миграцию, чтобы их сначала настроить.

Поскольку User является заменяемой зависимостью, Django будет игнорировать миграцию User в приложении auth, которое используется вместо вас. Но миграции для всех остальных моделей auth будут применяться с auth.migrations.

Именно из-за этой зависимости от auth миграций очень трудно изменить пользовательскую модель пользователя после того, как вы уже настроили свой проект:

Из-за ограничений функции динамической зависимости Django для сменных моделей модель, на которую ссылается AUTH_USER_MODEL, должна быть создана при первой миграции его приложения (обычно это называется 0001_initial); в противном случае у вас будут проблемы с зависимостями.

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