2017-02-23 489 views
2

Я создаю пользовательскую модель пользователя.Ошибка несоответствияMigrationHistory с пользовательской моделью пользователя django

я выполнил команду python manage.py makemigrations accounts, а затем побежал python manage.py migrate accounts, который выводит следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "manage.py", line 22, in <module> 
    execute_from_command_line(sys.argv) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/management/__init__.py", line 367, in execute_from_command_line 
    utility.execute() 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/management/__init__.py", line 359, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/management/base.py", line 294, in run_from_argv 
    self.execute(*args, **cmd_options) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/management/base.py", line 345, in execute 
    output = self.handle(*args, **options) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 86, in handle 
    executor.loader.check_consistent_history(connection) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/migrations/loader.py", line 292, in check_consistent_history 
    connection.alias, 
django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency accounts.0001_initial on database 'default'. 

Вот моя модель пользователя:

from __future__ import unicode_literals 

from django.db import models 
from django.utils import timezone 
from PIL import Image 
from django.contrib.auth.models import (
    AbstractBaseUser, 
    BaseUserManager, 
    PermissionsMixin 
) 

class UserManager(BaseUserManager): 

    def create_user(self, email, username, password): 
     if not email: 
      raise ValueError("Users must have an email.") 

     user = self.model(
      email=self.normalize_email(email), 
      username=username 
     ) 

     user.set_password(password) 
     user.save() 
     return user 

    def create_superuser(self, email, username, password): 
     user = self.create_user(
      email, 
      username, 
      password 
     ) 
     user.is_staff = True 
     user.is_superuser = True 
     user.save() 
     return user 


class User(AbstractBaseUser, PermissionsMixin): 
    email = models.EmailField(unique=True) 
    username = models.CharField(max_length=40, unique=True) 
    avatar = models.ImageField(blank=True, null=True) 
    date_joined = models.DateTimeField(default=timezone.now) 
    is_active = models.BooleanField(default=True) 
    is_staff = models.BooleanField(default=False) 

    objects = UserManager() 

    USERNAME_FIELD = "email" 
    REQUIRED_FIELDS = ["username", "password"] 

    def __str__(self): 
     return "@{}".format(self.username) 

    def get_short_name(self): 
     return self.username 

Вот только миграция файлов в приложении:

from __future__ import unicode_literals 

from django.db import migrations, models 
import django.utils.timezone 


class Migration(migrations.Migration): 

    initial = True 

    dependencies = [ 
     ('auth', '0008_alter_user_username_max_length'), 
    ] 

    operations = [ 
     migrations.CreateModel(
      name='User', 
      fields=[ 
       ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 
       ('password', models.CharField(max_length=128, verbose_name='password')), 
       ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), 
       ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), 
       ('email', models.EmailField(max_length=254, unique=True)), 
       ('username', models.CharField(max_length=40, unique=True)), 
       ('avatar', models.ImageField(blank=True, null=True, upload_to=b'')), 
       ('date_joined', models.DateTimeField(default=django.utils.timezone.now)), 
       ('is_active', models.BooleanField(default=True)), 
       ('is_staff', models.BooleanField(default=False)), 
       ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')), 
       ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')), 
      ], 
      options={ 
       'abstract': False, 
      }, 
     ), 
    ] 

Я никогда не сталкивался с этой ошибкой до и не знаю, как прогрессировать. Как решить эту проблему?

+0

Похоже, вы изменили модель пользователя после применения миграции администратора. Пожалуйста, прочитайте [Переход к пользовательскому среднему проекту пользователя] (https://docs.djangoproject.com/en/1.10/topics/auth/customizing/#changing-to-a-custom-user-model-mid-project). – knbk

ответ

1

Джанго миграция может иметь свои зависимости от других моделей миграции Django , например:

dependencies = [ 
    ('language', '0001_initial'), 
] 

Migration admin.0001_initial is applied before its dependency accounts.0001_initial on database 'default'.

кажется каким-то образом ваш admin.0001_initial имеет зависимости от accounts.0001_initial и уже мигрировали. Вы должны вручную переделывать зависимости.

0

Я сделал то же самое при создании нового проекта в Django, мне нужно было удалить базу данных и запустить команду python manage.py migrate. Был создано .0001_initial приложения, в котором было новая таблица пользователей и когда были выполнены Миграции этого порядок был замечен

Operations to perform: 
    Apply all migrations: admin, auth, contenttypes, sessions, subscription 
Running migrations: 
    Applying contenttypes.0001_initial... OK 
    Applying contenttypes.0002_remove_content_type_name... OK 
    Applying auth.0001_initial... OK 
    Applying auth.0002_alter_permission_name_max_length... OK 
    Applying auth.0003_alter_user_email_max_length... OK 
    Applying auth.0004_alter_user_username_opts... OK 
    Applying auth.0005_alter_user_last_login_null... OK 
    Applying auth.0006_require_contenttypes_0002... OK 
    Applying auth.0007_alter_validators_add_error_messages... OK 
    Applying auth.0008_alter_user_username_max_length... OK 
    Applying subscription.0001_initial... OK 
    Applying admin.0001_initial... OK 
    Applying admin.0002_logentry_remove_auto_add... OK 
    Applying sessions.0001_initial... OK 

Как вы видите admin.0001_initial выполняются после subscription.0001_initial миграции, которая устраняет проблемы зависимости