0

我的Blog模型有AutoSlugFieldwhich usesBlog.__unicode__()方法。

数据迁移后,所有Blog实例都将 slug 设置为blog-object-<number>而不是<year>-<month>-<day>. 似乎定义Blog.__unicode__()被忽略了。

我怎样才能正确迁移Blog模型?

模型字段.py:

class AutoSlugField(models.CharField):
    def pre_save(self, blog, *args, **kwargs):
        return slugify(unicode(blog))

模型.py:

class Blog(models.Model):
    title = models.CharField(max_length=255)
    created = models.DateTimeField(auto_now_add=True)
    slug = AutoSlugField(max_length=50)

    def __unicode__(self):
        return self.created.strftime('%Y-%m-%d')

移民:

from south.v2 import DataMigration

class Migration(DataMigration):
    def forwards(self, orm):
        for blog in orm.Blog.objects.all():
            blog.title = blog.title.replace('django', 'Django')
            blog.save() 
4

2 回答 2

1

South 什么都不做,只是在你的表中添加列,而 django 在其中没有任何作用。因此,当您运行迁移时,不会调用 django 模型保存方法,因此不会调用预保存方法。South 仅适用于数据库,即您可以提供可以在 db 级别设置的属性,例如默认值、可为空等。要将 slug 添加到 db 中的现有记录,请创建 util 函数,该函数将 slugify 您的字段或编写数据迁移。

于 2013-12-15T18:55:53.673 回答
0

我已经更新到 South 0.7.6 并使用了South documentation中的解决方案。简单地添加to_python()get_prep_value()保留slug字段的方法。

class AutoSlugField(models.CharField):
    def pre_save(self, blog, *args, **kwargs):
        return slugify(unicode(blog))

    def to_python(self, value):
        return value

    def get_prep_value(self, value):
        return value
于 2013-12-16T08:04:33.707 回答