Добавить ненулевое и уникальное поле с уже заполненной моделью

У меня есть одна модель в моем приложении, работающая на сервере с несколькими записями. Мне нужно добавить SlugField, уникальный и не-null для этой модели. SlugField будет заселен на основе trading_name. Я изменил свою модель, чтобы добавить это новое поле и модифицированный метод сохранения:

class Supplier(StatusModel):
    SLUG_MAX_LENGTH = 210
    slug = models.SlugField(unique=True, max_length=SLUG_MAX_LENGTH)
    trading_name = models.CharField(max_length=200, verbose_name=_('trading name'))
    ...

    def save(self, *args, **kwargs):
        self.slug = orig = slugify(self.trading_name)[:Supplier.SLUG_MAX_LENGTH]

        for x in itertools.count(1):
            if not Supplier.objects.filter(slug=self.slug).exists():
                break
            # Truncate the original slug dynamically. Minus 1 for the hyphen.
            self.slug = "%s-%d" % (orig[:Supplier.SLUG_MAX_LENGTH - len(str(x)) - 1], x)

        self.full_clean()
        super(Supplier, self).save(*args, **kwargs)

После изменения модели я запустил manage.py makemigrations и получил эту миграцию как вывод:

class Migration(migrations.Migration):

    dependencies = [
        ('opti', '0003_auto_20141226_1755'),
    ]

    operations = [
        migrations.AddField(
            model_name='supplier',
            name='slug',
            field=models.SlugField(unique=True, default='', max_length=210),
            preserve_default=False,
        ),
    ]

Я не могу запустить manage.py migrate, потому что значение по умолчанию не работает из-за уникального constrant.

Мой вопрос: как я могу это сделать с Django 1.7? Мне нужно применить изменение схемы и сохранить текущие записи в моей базе данных.

Ответ 1

К сожалению, я не нашел ответа, но я мог бы создать одно решение:

  • Сначала я создал миграцию, которая позволяет пустому полю пустым,
  • Затем я создал другую миграцию, которая заполняет столбец slug соответствующими значениями для каждой строки в модели;
  • Затем еще одна миграция, которая добавляет в столбце ограничение null.

Ответ 2

Вы выполняете изменения модели (добавьте поле, измените и т.д.), затем вы вызываете manage.py makemigrations, затем применяете миграцию с помощью manage.py migrate

Вы можете добавить поле с помощью null=True, то вы, например, сделайте script, чтобы заполнить его один раз

В противном случае, если вам нужно заполнить поле в рамках миграции, вы можете написать пользовательский, см. https://docs.djangoproject.com/en/1.7/ref/migration-operations/#writing-your-own