Хочу добавить кастомный менеджер во встроенную модель 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.
@Daviddd Нет. Но я не могу воспроизвести это сегодня ...
Спасибо за ответ. Я покопаюсь в этом, такая же проблема здесь github.com/divio/django-cms/issues/4317, а также
@Daviddd спасибо за ссылку. Их исправление добавлял use_in_migrations = False
. Это действительно работает, если я создаю подкласс auth.User
и использую модель MyUser
. Проблема возникает из User.add_to_class('active_users', ActiveUserManager())
.
Догадаться.
Мне также нужно было добавить диспетчер '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'
не был установлен User.add_to_class('objects', UserManager())
.
Менеджер по умолчанию добавляется к миграции, даже если установлен use_in_migrations = False
.
Спасибо за это. К сожалению, в моем случае не работает: stackoverflow.com/questions/55923797/…. Он по-прежнему создает n файлов миграции.
Вы это решили?