我想向内置ZipFile.CreateFromDirectory(startPath, zipPath);
模型添加自定义管理器。
由于数据库中的现有数据链接到auth_user表,因此避免切换到自己的用户模型。
所以我将以下内容添加到models.py:
auth.User
这似乎可行,直到我运行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())
时,Django才在python manage.py makemigrations
文件夹中创建一个迁移文件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
模型添加自定义管理器的建议,我将不胜感激。我正在使用Django 1.11。
答案 0 :(得分:1)
想通了。
我还需要向'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
,默认管理器也已添加到迁移中。