我想在内置的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。
弄清楚了。
我还需要将'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
,默认管理器也会添加到迁移中。