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

标签 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的类方法。 .

我该如何解决这个问题?

最佳答案

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 以找出需要手动填写哪些字段)。

关于django - 通过数据迁移添加默认标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33039013/

相关文章:

django - angular.js 的一个很好的服务器端解决方案

django - 为什么 django send_mail 无法无误地发送电子邮件?

django - Django 中的 Treebeard 管理员

django - 是否可以集成django-taggit和django-mptt/django-treebeard?

python - 为什么这个 Django 表单没有引发 ValidationError?

Django 优化查询

python - 如何让 South 在 Heroku 中为 Django 应用程序工作

python - 使用 Django 安装 South 时出现问题(不会创建 south_migrationhistory 表)

python - 使用 south 重命名 django 模型类名和相应的外键,而不会丢失数据

django - django-treebeard 物化路径节点的动态排序