重命名 Django 模型中的唯一字段并迁移
rename unique field in django model and migrate
我有一个看起来像这样的模型:
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
username = models.TextField(max_length=100, unique=True)
# other fields
然后我在进一步研究我正在构建的内容后意识到,username
字段的名称略有不同非常重要,因此对该行进行了更改:
username_internal = models.TextField(max_length=100, unique=True)
和 运行 python manage.py makemigrations myapp
。
它要求我提供默认值,但是当我查看它创建的 .py 迁移时,不喜欢它所做的事情:
# -*- coding: utf-8 -*-
# Generated by Django 1.11.4 on 2018-11-14 10:49
from __future__ import unicode_literals
import django.contrib.auth.validators
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('myapp', '0002_user_internalid'),
]
operations = [
migrations.AddField(
model_name='user',
name='username_internal',
field=models.TextField(default=5, max_length=100, unique=True),
preserve_default=False,
),
migrations.AlterField(
model_name='user',
name='username',
field=models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username'),
),
]
它正在尝试创建一个新字段,我只是想让它重命名现有字段。
我是 Django 的新手(使用 1.11.4)有人知道如何解决这个问题吗?
由于您使用 classing AbstractUser
,它始终包含 username
字段,因此不会为迁移选择重命名。您需要将用户模型 class 更改为如下所示:
from django.contrib.auth.models import AbstractBaseUser
class User(AbstractBaseUser):
username_internal = models.TextField(max_length=100, unique=True)
...
USERNAME_FIELD = 'username_internal'
...
# you will also need to the user manager `objects = UserManager()`
# you may be able to import and use the existing user manager from `django.contrib.auth.models import UserManager` depending on your other fields.
https://docs.djangoproject.com/en/2.1/topics/auth/customizing/#a-full-example 上提供了完整示例。
您可能需要根据您的用例重新实现权限方法。参见 PermissionsMixin。
我有一个看起来像这样的模型:
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
username = models.TextField(max_length=100, unique=True)
# other fields
然后我在进一步研究我正在构建的内容后意识到,username
字段的名称略有不同非常重要,因此对该行进行了更改:
username_internal = models.TextField(max_length=100, unique=True)
和 运行 python manage.py makemigrations myapp
。
它要求我提供默认值,但是当我查看它创建的 .py 迁移时,不喜欢它所做的事情:
# -*- coding: utf-8 -*-
# Generated by Django 1.11.4 on 2018-11-14 10:49
from __future__ import unicode_literals
import django.contrib.auth.validators
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('myapp', '0002_user_internalid'),
]
operations = [
migrations.AddField(
model_name='user',
name='username_internal',
field=models.TextField(default=5, max_length=100, unique=True),
preserve_default=False,
),
migrations.AlterField(
model_name='user',
name='username',
field=models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username'),
),
]
它正在尝试创建一个新字段,我只是想让它重命名现有字段。
我是 Django 的新手(使用 1.11.4)有人知道如何解决这个问题吗?
由于您使用 classing AbstractUser
,它始终包含 username
字段,因此不会为迁移选择重命名。您需要将用户模型 class 更改为如下所示:
from django.contrib.auth.models import AbstractBaseUser
class User(AbstractBaseUser):
username_internal = models.TextField(max_length=100, unique=True)
...
USERNAME_FIELD = 'username_internal'
...
# you will also need to the user manager `objects = UserManager()`
# you may be able to import and use the existing user manager from `django.contrib.auth.models import UserManager` depending on your other fields.
https://docs.djangoproject.com/en/2.1/topics/auth/customizing/#a-full-example 上提供了完整示例。
您可能需要根据您的用例重新实现权限方法。参见 PermissionsMixin。