Django South datamigration pre_save()使用模型的__unicode __()

时间:2013-12-15 18:07:11

标签: python django migration django-south autofield

我的Blog模型AutoSlugField使用了Blog.__unicode__()方法。

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

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

modelfields.py:

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

models.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() 

2 个答案:

答案 0 :(得分:1)

South什么也没做,只是在你的桌子上添加了一个列,django没有任何角色可以玩。因此,当您运行迁移时,不会调用django model save方法,因此不会调用pre-save方法。 South仅适用于数据库,即您可以提供默认值,可空等属性,可以在db级别设置。要将slug添加到db中的现有记录,请创建util函数,该函数会强制您的字段或编写数据迁移。

答案 1 :(得分: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