переименовать уникальное поле в модели Django и перенести - PullRequest
0 голосов
/ 14 ноября 2018

У меня была модель, которая выглядит следующим образом:

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) Кто-нибудь знает, как это исправить?

1 Ответ

0 голосов
/ 14 ноября 2018

Из-за того, что вы создаете подклассы AbstractUser, оно всегда включает поле username, поэтому не выбирает переименование для миграций.Вам нужно будет изменить класс пользовательской модели, чтобы он выглядел примерно так:

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 .

...