在南方数据迁移中使用django-taggit?

时间:2012-12-03 21:48:27

标签: django django-south django-taggit

我有一个使用django-taggit的模型。我想执行一个向此模型添加标记的南数据迁移。但是,在南迁移中无法使用.tags管理器,您必须使用南方orm ['myapp.MyModel'] API而不是普通的Django orm。

执行此类操作会引发异常,因为post.tags为None。

post = orm['blog.Post'].objects.latest()
post.tags.add('programming')

是否可以在南数据迁移中使用taggit创建和应用标签?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:7)

是的,您可以这样做,但您需要直接使用Taggit的API(即创建TagTaggedItem),而不是使用add方法

首先,您需要先将taggit冻结到此迁移中:

./manage.py datamigration blog migration_name --freeze taggit

然后你的转发方法看起来像这样(假设你有一个你想要应用于所有Post对象的标签列表。

def forwards(self, orm):
    for post in orm['blog.Post'].objects.all():
        # A list of tags you want to add to all Posts.
        tags = ['tags', 'to', 'add']

        for tag_name in tags:
            # Find the any Tag/TaggedItem with ``tag_name``, and associate it
            # to the blog Post
            ct = orm['contenttypes.contenttype'].objects.get(
                app_label='blog',
                model='post'
            )
            tag, created = orm['taggit.tag'].objects.get_or_create(
                name=tag_name)
            tagged_item, created = orm['taggit.taggeditem'].objects.get_or_create(
                tag=tag,
                content_type=ct,
                object_id=post.id  # Associates the Tag with your Post
            )

答案 1 :(得分:0)

我想不是。您必须先执行迁移,然后使用posts对象添加默认标记。标签与模型无关。它们与模型对象相关联。