django 手写迁移更改身份验证

Posted

技术标签:

【中文标题】django 手写迁移更改身份验证【英文标题】:django handwritten migrations altering auth 【发布时间】:2015-10-01 20:14:33 【问题描述】:

我正在使用 django 1.8.1 并尝试从我的一个应用程序中扩展 auth_user name 字段的长度。之前,对于南,我可以使用如下划线来定位应用程序:

db.alter_column('auth_group', 'name', models.CharField(max_length=120, null=False, blank=False))

但是,在 django 1.8 中,我看不到这样做的方法,因为 django 将应用程序名称放入带有源代码的 sql 中。我不想编辑 django 源代码,所以我无法改变它。我目前的尝试在这里:

class Migration(migrations.Migration):

dependencies = [
    ('auth', '0006_require_contenttypes_0002'),
]       

operations = [
    migrations.AlterField('auth_group', 'name', field=models.CharField(max_length=120, null=False, blank=False)),
]

请帮忙。我不想编辑 django 源代码,我只想做 migrations.RunSQL 作为最后的手段。

【问题讨论】:

【参考方案1】:

嗯,有一个棘手的方法可以做到这一点:

# -*- coding: utf-8 -*-
from django.db.migrations import Migration as DjangoMigration, AlterField
from django.db.models import CharField


class Migration(DjangoMigration):
    dependencies = [
        # Specify other dependencies, if required.
        ('auth', '0006_require_contenttypes_0002')
    ]
    operations = [
        AlterField(
            model_name='User',
            name='username',
            field=CharField(max_length=120)
        )
    ]

    def mutate_state(self, project_state, preserve=True):
        """
        This is a workaround that allows to store ``auth``
        migration outside the directory it should be stored.
        """
        app_label = self.app_label
        self.app_label = 'auth'
        state = super(Migration, self).mutate_state(project_state, preserve)
        self.app_label = app_label
        return state

    def apply(self, project_state, schema_editor, collect_sql=False):
        """
        Same workaround as described in ``mutate_state`` method.
        """
        app_label = self.app_label
        self.app_label = 'auth'
        state = super(Migration, self).apply(project_state, schema_editor, collect_sql)
        self.app_label = app_label
        return state

把它放在你的应用程序的migrations 文件夹中,并使用正确的名称,例如0001_alter_auth_user_username.py.

不过,我不确定这是不是一个好方法。

【讨论】:

所以本质上,我正在更改整个迁移类的应用名称? @IanKirkpatrick 您正在某些地方对其进行更改,以便迁移可以从正确的应用程序获取模型,即User 模型将从auth 应用程序获得,同时迁移本身将属于您的项目。 【参考方案2】:

感谢@Ernest 十。

就我而言,我保持对:dependencies = [ # Specify other dependencies, if required. ('auth', '0004_alter_user_username_opts') ] 确保您运行“python manage.py migrate”以将其反映给您的数据库。

【讨论】:

以上是关于django 手写迁移更改身份验证的主要内容,如果未能解决你的问题,请参考以下文章

Django 如何在第一次迁移时制作与用户、身份验证、组、会话等相关的表?

django 会话密钥在身份验证时更改

Django - 当页面不存在或用户未通过身份验证时返回更改答案

如何在身份验证和授权的 Django Admin 部分更改权限框的大小?

令牌身份验证在 Django Rest 框架上不起作用

如何添加身份验证中间件 JWT django?