Django: не создавать миграцию при добавлении собственного менеджера в auth.User - PullRequest
0 голосов
/ 03 октября 2018

Я бы хотел добавить пользовательский менеджер во встроенную модель auth.User.

Я избегаю переключения на свою собственную модель пользователя из-за существующих данных в базе данных, ссылающихся на таблицу auth_user.

Поэтому я добавляю следующее в models.py:

from django.contrib.auth.models import User, UserManager

class ActiveUserManager(UserManager):
    use_in_migrations = False
    def get_queryset(self):
        return super().get_queryset().filter(is_active=True)

# Monkeypatch auth.User to have custom manager
User.add_to_class('active_users', ActiveUserManager())

Это работает, пока при запуске python manage.py makemigrations Django не создаст файл миграции 000n_auto_20181002_1721.py в папке myvenv/Lib/site-packages/django/contrib/auth/migrations,со следующим содержанием:

# imports omitted
class Migration(migrations.Migration):

    dependencies = [
        ('auth', '0008_alter_user_username_max_length'),
    ]

    operations = [
        migrations.AlterModelManagers(
            name='user',
            managers=[
                ('active_users', django.db.models.manager.Manager()),
                ('objects', django.contrib.auth.models.UserManager()),
            ],
        ),
    ]

Установка use_in_migrations = False в классе ActiveUserManager не помогает.

Буду признателен за ваши предложения о том, как избежать создания этого файла миграции или как добавитьнастраиваемый менеджер для встроенной модели auth.User без этого поведения.Я использую Django 1.11.

1 Ответ

0 голосов
/ 30 апреля 2019

Понял.

Мне нужно было также добавить 'objects' менеджер к User классу, в противном случае Django рассматривает 'active_users' как менеджер по умолчанию.

Полный код ниже:

from django.contrib.auth.models import User, UserManager

class ActiveUserManager(UserManager):
    use_in_migrations = False
    def get_queryset(self):
        return super().get_queryset().filter(is_active=True)

# IMPORTANT! to add 'objects' manager
# Otherwise Django treats 'active_users' as the default manager
User.add_to_class('objects', UserManager())

# Monkeypatch auth.User to have custom manager
User.add_to_class('active_users', ActiveUserManager())

Я понял это, прочитав ModelState.fromModel () , где 'active_users' было _default_manager, когда 'objects' manager не был установлен User.add_to_class('objects', UserManager()).

Менеджер по умолчанию добавляется в миграцию, даже если установлен use_in_migrations = False.

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