通过数据迁移添加默认标签
Adding default tags via data migration
我正在使用 hierarchical tags which work with taggit and 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
是 treebeard 中 MP_Node
的 class 方法。
我该如何解决这个问题?
TLDR: 如果你使用 app.get_model
而不是导入它,你就不能使用 treebeard API。
当你使用
HierarchicalTag = apps.get_model("aion", "HierarchicalTag")
要获取 HeirarchicalTag 模型而不是导入它,实际上您不会获取 treebeard API。你没有得到代码中定义的模型,你得到的是 Django 根据你的迁移推断出的模型版本。这就是为什么 app.get_model
将在您删除特定模型的实际代码后继续工作(并且 那 就是为什么您在迁移中使用 app.get_model
而不是导入)。
解决方案:
- 编写一个注定要最终失败的迁移,只导入
HierarchicalTag
。
- 继续使用
app.get_model
,但随后手动插入根(请参阅 the django-treebeard api 了解哪些字段需要手动填写)。
我正在使用 hierarchical tags which work with taggit and 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
是 treebeard 中 MP_Node
的 class 方法。
我该如何解决这个问题?
TLDR: 如果你使用 app.get_model
而不是导入它,你就不能使用 treebeard API。
当你使用
HierarchicalTag = apps.get_model("aion", "HierarchicalTag")
要获取 HeirarchicalTag 模型而不是导入它,实际上您不会获取 treebeard API。你没有得到代码中定义的模型,你得到的是 Django 根据你的迁移推断出的模型版本。这就是为什么 app.get_model
将在您删除特定模型的实际代码后继续工作(并且 那 就是为什么您在迁移中使用 app.get_model
而不是导入)。
解决方案:
- 编写一个注定要最终失败的迁移,只导入
HierarchicalTag
。 - 继续使用
app.get_model
,但随后手动插入根(请参阅 the django-treebeard api 了解哪些字段需要手动填写)。