Django:在向auth.User添加自定义管理器时不要创建迁移

问题描述 投票:1回答:1

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

python django python-3.x migration django-authentication
1个回答
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,默认管理器也会添加到迁移中。

© www.soinside.com 2019 - 2024. All rights reserved.