Django:为数据库中的现有条目生成 slug 字段数据

Posted

技术标签:

【中文标题】Django:为数据库中的现有条目生成 slug 字段数据【英文标题】:Django: Generate slug field data for existing entries in database 【发布时间】:2016-09-15 12:58:16 【问题描述】:

前段时间我创建了一个 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,有办法吗?

谢谢!

【问题讨论】:

AutoSlugFielddefault 参数吗? 【参考方案1】:

这是我在相同情况下的代码。

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,
        ),
    ]

【讨论】:

好问题,尽管您可以使用 migrations.RunPython.noop 来向后函数! 创建空迁移:python manage.py makemigrations --empty your_app_name

以上是关于Django:为数据库中的现有条目生成 slug 字段数据的主要内容,如果未能解决你的问题,请参考以下文章

Django迁移默认值可调用生成相同的条目

编辑 Django 表单中的现有条目

Django中的“slu”是什么?

Django - 生成默认 slug

无法将关键字 u'slug' 解析为 Django 中的字段错误?

使用 django rest 框架,如何为现有父对象添加新的嵌套子对象