通过数据迁移添加默认标签

时间:2015-10-09 13:03:27

标签: django django-south django-treebeard

我正在使用与hierarchical tagstaggit一起使用的treebeard。我正在尝试进行数据迁移,因此我可以定义将在应用程序的所有实例中显示的标记。

我定义了这个方法:

def define_tags(apps, schema_editor):
    HierarchicalTag = apps.get_model("aion", "HierarchicalTag")
    root = HierarchicalTag.add_root(name='root')
    root.save()
    leaf = HierarchicalTag.objects.get(pk=root.pk).add_child(name='ook')
    leaf.save()

应该创建两个标签“root”和一个子“ook”。但是,当我运行迁移时,我收到此错误:

AttributeError: type object 'HierarchicalTag' has no attribute 'add_root'

方法add_root是来自treebeardMP_Node的类方法。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:5)

TLDR:如果您使用app.get_model而不是导入它,则无法使用treebeard API。

使用时

HierarchicalTag = apps.get_model("aion", "HierarchicalTag")

获取HeirarchicalTag模型而不是导入它,实际上你没有得到treebeard API。您没有得到代码中定义的模型,您将根据迁移获得django推断的模型版本。这就是为什么在删除某个模型的实际代码后app.get_model将继续工作的原因(而 是迁移中使用app.get_model而不是导入的原因)。

解决方案:

  1. 编写一个只能导入HierarchicalTag的目标到最终失败的迁移。
  2. 继续使用app.get_model,然后手动插入根(请参阅the django-treebeard api以确定需要手动填写哪些字段)。