【问题标题】:Adding default tags via data migration通过数据迁移添加默认标签
【发布时间】:2016-01-07 10:42:54
【问题描述】:

我正在使用hierarchical tags,它与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

我该如何解决这个问题?

【问题讨论】:

    标签: django django-south django-treebeard


    【解决方案1】:

    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,了解哪些字段需要手动填写)。

    【讨论】:

      猜你喜欢
      • 2011-10-29
      • 1970-01-01
      • 2019-12-31
      • 1970-01-01
      • 2020-11-07
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多