Django 1.11 Модель миграционных операций не применяется - PullRequest
0 голосов
/ 19 ноября 2018

Моя операция внутри моей миграции выполнена, тогда как в базе данных по полю плательщика ничего не произошло.

Вот моя модель:

class User(AbstractBaseUser, PermissionsMixin, WithCsvImportMixin):
    first_name = models.CharField(_('first name'), max_length=30, blank=False)
    last_name = models.CharField(_('last name'), max_length=30, blank=False)
    email = models.EmailField(_('email address'),
                              unique=True, blank=False)
    external_id = models.CharField(_('external id'), db_index=True, max_length=50, unique=True, blank=False, null=True)
    is_staff = models.BooleanField(_('staff status'), default=False)
    is_active = models.BooleanField(_('active'), default=True)
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)
    payer = models.CharField(_('payer'), max_length=50, blank=False, default='')

Первая миграция относительно поля плательщика:

# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2018-11-15 21:58
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('authenticate', '0012_auto_20181112_1631'),
    ]

    operations = [
        migrations.AddField(
            model_name='user',
            name='payer',
            field=models.CharField(default='', max_length=50, verbose_name='payer'),
        ),
    ]

И это тот, который выполняется, но результат, кажется, не применяется к базе данных:

# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2018-11-15 22:01
from django.db import migrations, transaction

from xxx.authenticate.models import User # The xxx is here to replace the actual application name

def create_payer_names(apps, schema_editor):
    with transaction.atomic():
        for user in User.objects.all():
            if user.external_id != "":
                user.payer = user.external_id
                user.save()

class Migration(migrations.Migration):

    dependencies = [
        ('authenticate', '0013_user_payer'),
    ]

    operations = [
        migrations.RunPython(create_payer_names, migrations.RunPython.noop, atomic=True),
    ]

Моя база данных уже заполнена, и у каждого пользователя естьexternal_id

>>> from xxx.authenticate.models import User
>>> for item in User.objects.all():
...     print(item.external_id)
... 
043819FZAFR
762944FZAFR
285895FZAFR
671800FZAFR
924618FZAFR
068805FZAFR
232544FZAFR
130978FZAFR
412568FZAFR
600003FZAFR
254624FZAFR
417745FZAFR
068280FZAFR
031971FZAFR
141936FZAFR
>>> 

А вот пустой результат предыдущих миграций:

>>> for item in User.objects.all():
...     print(item.payer)
... 























>>> 

Вот вывод для команды: manage.py showmigrations

authenticate
 [X] 0001_initial
 [X] 0002_auto_20171103_1722
 [X] 0003_auto_20171109_1206
 [X] 0004_auto_20180329_1049
 [X] 0005_auto_20180507_1123
 [X] 0006_user_by_pass_generates_invoice
 [X] 0007_auto_20180524_1732
 [X] 0008_auto_20180530_1525
 [X] 0009_auto_20180801_1644
 [X] 0010_user_payment
 [X] 0011_remove_user_payment
 [X] 0012_auto_20181112_1631
 [X] 0013_user_payer
 [X] 0014_auto_20181115_2301

И когда я это сделаю:

./manage.py migrate authenticate 0014

Вывод будет следующим:

Running migrations:
  No migrations to apply.

Может ли кто-нибудь объяснить мне, что я делаю неправильно и почему операция миграции не применяется какэто должно быть?

1 Ответ

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

В процессе миграции вы должны использовать apps.get_model, чтобы получить модель User.См. Документацию по [миграциям данных] для получения дополнительной информации.

def create_payer_names(apps, schema_editor):
    User = apps.get_model('authentication', 'User')
    with transaction.atomic():
        ...

Вывод showmigrations показывает, что миграция 0014 уже применена.Вот почему вы получаете сообщение No migrations to apply.

 [X] 0014_auto_20181115_2301

Вы можете перезапустить миграцию 0014, вернувшись сначала к миграции 0013.

./manage.py migrate --fake authenticate 0013
./manage.py migrate authenticate 0014
...