Пользовательская миграция Django не выполняется - PullRequest
0 голосов
/ 24 мая 2018

Итак, я добавил новое поле «status» в таблицу базы данных django.Это поле нуждалось в значении по умолчанию, поэтому я по умолчанию установил его как «Новый», но затем я добавил специальный файл миграции, который вызывает метод save () для всех объектов в этой таблице, так как у меня есть переопределение save () для проверкидругую таблицу и вытащите правильный статус из этого.Однако после выполнения этой миграции все статусы по-прежнему устанавливаются на «Новый», поэтому похоже, что сохранение не выполняется.Я проверил это, вручную вызвав команду save для всех объектов после запуска миграции, и статусы были обновлены, как и ожидалось.

Вот модель таблицы в models.py:

class SOS(models.Model):
    number = models.CharField(max_length=20, unique=True)
    ...
    # the default="New" portion is missing here because I have a migration to remove it after the custom migration (shown below) that saves the models
    status = models.CharField(max_length=20)

    def save(self, *args, **kwargs):
        self.status = self.history_set.get(version=self.latest_version).status if self.history_set.count() != 0 else "New"
        super(SOS, self).save(*args, **kwargs)

Ивот миграция:

# Generated by Django 2.0.5 on 2018-05-23 13:50
from django.db import migrations, models

def set_status(apps, schema_editor):
    SOS = apps.get_model('sos', 'SOS')
    for sos in SOS.objects.all():
        sos.save()

class Migration(migrations.Migration):

    dependencies = [
        ('sos', '0033_auto_20180523_0950'),
    ]

    operations = [
        migrations.RunPython(set_status),
    ]

Так что мне кажется довольно ясным, что я делаю что-то не так с миграцией, но я точно соответствовал тому, что вижу в документации Django и я также сравнил его с этим ответом StackOverflow, и я не вижу, что я делаю неправильно.При запуске миграций ошибок нет, но созданная мною специальная программа запускается практически мгновенно, что кажется странным, поскольку, когда я выполняю сохранение вручную, для сохранения всех 300+ записей требуется около 5 секунд.

Есть какие-нибудь предложения?

PS Пожалуйста, дайте мне знать, если есть какие-либо соответствующие подробности, которые я забыл включить.

1 Ответ

0 голосов
/ 24 мая 2018

Когда вы запускаете миграции и получаете Model из приложений, вы не можете использовать собственные менеджеры или пользовательские сохранения или создания или что-то в этом роде.У этой модели есть только поля и все.Если вы хотите достичь того, чего хотите, вы должны добавить свою логику в свои миграции следующим образом:

# comment to be more than 6 chars...
def set_status(apps, schema_editor):
    SOS = apps.get_model('sos', 'SOS')
    for sos in SOS.objects.all():
        if sos.history_set.exists():
            sos.status = sos.history_set.get(version=sos.latest_version).status 
        else:
            sos.status =  "New"
        sos.save()
...