Python 重命名django模型中的唯一字段并迁移
我有一个模型,看起来像这样:Python 重命名django模型中的唯一字段并迁移,python,django,django-models,django-1.11,Python,Django,Django Models,Django 1.11,我有一个模型,看起来像这样: 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 from django.contrib.auth.models import Abstrac
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
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.
然后,在进一步研究我正在构建的内容之后,我意识到,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),有人知道如何解决这个问题吗?由于您对
AbstractUser
进行了子类化,它总是包含用户名
字段,因此没有为迁移选择重命名。您需要更改用户模型类,使其看起来像这样:
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
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.
上提供了完整的示例
根据您的用例,您可能需要重新实现权限方法。请参阅。谢谢,我修改了迁移,并运行了
python manage.py migrate
它看起来运行正常,但似乎破坏了某些东西,我正在尝试解决问题。我认为您一定是对的,尽管它可能应该如所述为“alter”。也许这是使用Django 1.11的一个特点(不是我的选择)。症状是创建了新列“username\u internal”,而不是重命名!我认为问题更可能是用户名“TextField”覆盖了Django的标准用户“Charfield”。我现在放弃重命名,如果它将是如此困难,回滚到以前的迁移。哦,是的。我明白为什么会这样。这是因为您正在对AbstractUser
进行子类化,它总是包含username
字段。要更改用户名字段的名称,您必须创建稍微不同的用户类。他们在Django文档中有一个例子。我已经更新了我的答案。希望这一次能为你指明正确的方向;一旦我完成了当前的想法,PThanks将对其进行测试/调整,并有望成为它的终结。我认为如果原始模型中的字段不被称为“username”,那么@Max的解决方案就会起作用。我是Django的新手,但我认为这已经覆盖了Django的标准用户模型,而不仅仅是添加到Django的标准用户模型中,并导致了一些重命名问题。