添加已填充模型的非null和唯一字段

时间:2015-01-02 22:21:34

标签: django django-1.7 django-migrations

我的应用程序中有一个模型在一个带有几个条目的服务器中运行。我需要为此模型添加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做到这一点?我需要应用架构更改并将当前条目保留在我的数据库中。

2 个答案:

答案 0 :(得分:24)

不幸的是,我没有找到答案,但我可以创建一个解决方案:

  • 首先,我创建了一个允许slug字段可以为空的迁移;
  • 然后我创建了另一个迁移,用适当的值填充了slug列到模型中的每一行;
  • 然后是另一个在列中添加非空约束的迁移。

答案 1 :(得分:2)

您进行模型更改(添加字段,更改等),然后调用manage.py makemigrations,然后将迁移应用于manage.py migrate

您可以使用null=True添加字段,然后例如制作一个脚本来填充它

否则,如果您需要填充迁移中的字段,可以编写自定义字段,请参阅https://docs.djangoproject.com/en/1.7/ref/migration-operations/#writing-your-own