Использовать django-taggit в южной миграции данных?

У меня есть модель, использующая django-taggit. Я хочу выполнить миграцию данных на юг, которая добавит теги в эту модель. Однако менеджер .tags недоступен при миграции на юг, когда вы должны использовать API-интерфейс South orm ['myapp.MyModel'] вместо обычного Django orm.

Выполнение чего-то подобного вызовет исключение, потому что post.tags имеет значение None.

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

Можно ли создавать и применять теги с помощью taggit из миграции данных на юг? Если да, то как?


person Apreche    schedule 03.12.2012    source источник


Ответы (2)


Да, вы можете это сделать, но вам нужно использовать API Taggit напрямую (т.е. создать Tag и TaggedItem) вместо использования метода 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
            )
person Brad Montgomery    schedule 11.12.2012

Думаю, нет. Вы должны сначала выполнить миграцию, а затем добавить теги по умолчанию к объектам сообщений. Теги не связаны с моделями. Они связаны с объектами модели.

person Aamir Adnan    schedule 03.12.2012
comment
Да, это миграция данных, а не миграция схемы. - person Apreche; 04.12.2012