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

Django: do not create migration when adding custom manager to auth.User

我想将自定义管理器添加到内置 auth.User 模型。

我避免切换到我自己的用户模型,因为数据库中的现有数据链接到 auth_user table。

所以我将以下内容添加到 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 在 myvenv/Lib/site-packages/django/contrib/auth/migrations 文件夹中创建了一个迁移文件 000n_auto_20181002_1721.py,内容如下:

# 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()),
            ],
        ),
    ]

在 class ActiveUserManager 中设置 use_in_migrations = False 没有帮助。

如果您就如何避免创建此迁移文件或如何将自定义管理器添加到内置 auth.User 模型而不出现此行为提出建议,我将不胜感激。我正在使用 Django 1.11。

想通了。

我还需要将 'objects' 管理器添加到 User class,否则 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,默认管理器也会添加到迁移中。