前段时间我创建了一个Django模型:
class Product(models.Model):
name = models.CharField(verbose_name=_('Nome'), max_length=100)
description = models.CharField(verbose_name=_('Descrizione'), blank=True, default="")
现在我想插入一个slug字段:
class Product(models.Model):
name = models.CharField(verbose_name=_('Nome'), max_length=100)
slug = AutoSlugField(populate_from='name', unique=True)
description = models.CharField(verbose_name=_('Descrizione'), blank=True, default="")
我的问题是,当我创建一个迁移时,Django要求我插入一个slug字段的默认值。
我的想法是在迁移期间为数据库中的现有条目生成一个slug,有一种方法可以做到吗?
谢谢!
答案 0 :(得分:16)
这是我对相同情况的代码。
<强> models.py 强>:
slug = AutoSlugField(null=True, default=None, unique=True, populate_from='name')
请注意null = True,它与唯一字段兼容 在我的迁移中,我通过手动编辑迁移文件来添加数据迁移
<强> 0007_my_migration.py 强>:
def migrate_data_forward(apps, schema_editor):
for instance in MyModel.objects.all():
print "Generating slug for %s"%instance
instance.save() # Will trigger slug update
def migrate_data_backward(apps, schema_editor):
pass
class Migration(migrations.Migration):
...
operations = [
migrations.AddField(
model_name='my_model',
name='slug',
field=autoslug.fields.AutoSlugField(null=True, default=None, editable=False, populate_from='name', unique=True),
preserve_default=False,
),
migrations.RunPython(
migrate_data_forward,
migrate_data_backward,
),
]