Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 重命名django模型中的唯一字段并迁移_Python_Django_Django Models_Django 1.11 - Fatal编程技术网

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的标准用户模型中,并导致了一些重命名问题。