0

场景:具有许多第三方应用程序的大型项目。想要在不修改应用源的情况下为这些应用添加标签。

我的第一个想法是首先在 settings.py 中指定一个模型列表(例如['appname.modelname',],并在每个模型上调用 django-tagging 的register函数。注册函数将一个 TagField 和一个自定义管理器添加到指定的模型。这种方法的问题是该函数需要在生成数据库模式之前运行。

我尝试register直接在 中运行该函数settings.py,但我只需django.db.models.get_model要从一个字符串中获取实际的模型引用,而且我似乎无法从中导入它settings.py——无论我尝试什么,我都会收到 ImportError。tagging.register不过函数导入OK 。

所以我改变了策略,在一个原本空的应用程序中编写了一个自定义管理命令。问题是唯一连接到syncdb的信号post_syncdb对我来说是无用的,因为它在生成数据库模式后触发。

目前我能想到的唯一其他方法是生成并运行类似“南”的数据库模式迁移。这似乎更像是一个黑客而不是一个解决方案。

这似乎应该是一个非常普遍的需求,但我一直无法找到一个干净的解决方案。

所以我的问题是:是否可以在生成模式之前向模型动态添加字段,但更具体地说,是否可以在不编辑其源代码的情况下向第三方模型添加标记。

澄清一下,我知道可以在模型上没有 TagField 的情况下创建和存储标签,但这种方法存在一个主要缺陷,即难以同时创建和标记新模型。

4

1 回答 1

1

从文档:

您不必注册模型即可将它们与标记应用程序一起使用 - 通过注册添加的许多功能只是 Tag 和 TaggedItem 模型及其管理器提供的标记 API 的便利包装,如下所述。

查看 API 文档和随后的示例,了解如何将标签添加到系统中的任意对象。

http://api.rst2a.com/1.0/rst2/html?uri=http://django-tagging.googlecode.com/svn/trunk/docs/overview.txt#tags

更新

#views.py
def tag_model_view(request, model_id):
    instance_to_tag = SomeModel.objects.get(pk=model_id)
    setattr(instance_to_tag, 'tags_for_instance', request.POST['tags'])
    ...
    instance_to_tag.save()
    ...returns response

#models.py
#this is the post_save signal receiver
def tagging_post_save_handler(sender, instance, created):
    if hasattr(instance, 'tags_for_instance'):
        Tag.objects.update_tags(instance, instance.tags_for_instance)
于 2010-03-14T22:31:23.143 回答