4

我正在使用与taggittreebeard一起使用的分层标签。我正在尝试进行数据迁移,以便我可以定义将出现在应用程序的所有实例中的标签。

我定义了这个方法:

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_rootMP_Node来自treebeard的类方法。

我怎样才能解决这个问题?

4

1 回答 1

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,然后手动插入根(请参阅django-treebeard api以确定哪些字段需要手动填写)。
于 2015-11-19T15:20:00.250 回答