场景:具有许多第三方应用程序的大型项目。想要在不修改应用源的情况下为这些应用添加标签。
我的第一个想法是首先在 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 的情况下创建和存储标签,但这种方法存在一个主要缺陷,即难以同时创建和标记新模型。