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

aza*_*lea 6 python migration django django-authentication python-3.x

我想为内置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())
Run Code Online (Sandbox Code Playgroud)

这似乎有效,直到当我运行时python manage.py makemigrations,Django000n_auto_20181002_1721.pymyvenv/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()),
            ],
        ),
    ]
Run Code Online (Sandbox Code Playgroud)

use_in_migrations = False在课堂ActiveUserManager上设置无济于事。

我非常感谢您就如何避免创建此迁移文件或如何在auth.User没有此行为的情况下向内置模型添加自定义管理器的建议。我正在使用 Django 1.11。

aza*_*lea 6

弄清楚了。

我还需要将'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())
Run Code Online (Sandbox Code Playgroud)

我通过阅读意识到这ModelState.fromModel() ,其中'active_users'_default_manager'objects'经理没有被设置User.add_to_class('objects', UserManager())

即使use_in_migrations = False设置了默认管理器也会被添加到迁移中。