Django:将自定义管理器添加到auth.User时不创建迁移

时间:2018-10-02 21:30:24

标签: python django python-3.x migration django-authentication

我想向内置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。

1 个答案:

答案 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,默认管理器也已添加到迁移中。