Django:将自定义管理器添加到 auth.User 时不创建迁移
Django: do not create migration when adding custom manager to auth.User
我想将自定义管理器添加到内置 auth.User
模型。
我避免切换到我自己的用户模型,因为数据库中的现有数据链接到 auth_user table。
所以我将以下内容添加到 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 在 myvenv/Lib/site-packages/django/contrib/auth/migrations
文件夹中创建了一个迁移文件 000n_auto_20181002_1721.py
,内容如下:
# 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()),
],
),
]
在 class ActiveUserManager
中设置 use_in_migrations = False
没有帮助。
如果您就如何避免创建此迁移文件或如何将自定义管理器添加到内置 auth.User
模型而不出现此行为提出建议,我将不胜感激。我正在使用 Django 1.11。
想通了。
我还需要将 'objects'
管理器添加到 User
class,否则 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
,默认管理器也会添加到迁移中。
我想将自定义管理器添加到内置 auth.User
模型。
我避免切换到我自己的用户模型,因为数据库中的现有数据链接到 auth_user table。
所以我将以下内容添加到 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 在 myvenv/Lib/site-packages/django/contrib/auth/migrations
文件夹中创建了一个迁移文件 000n_auto_20181002_1721.py
,内容如下:
# 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()),
],
),
]
在 class ActiveUserManager
中设置 use_in_migrations = False
没有帮助。
如果您就如何避免创建此迁移文件或如何将自定义管理器添加到内置 auth.User
模型而不出现此行为提出建议,我将不胜感激。我正在使用 Django 1.11。
想通了。
我还需要将 'objects'
管理器添加到 User
class,否则 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
,默认管理器也会添加到迁移中。