【问题标题】:Trees with Django models - different approaches带有 Django 模型的树 - 不同的方法
【发布时间】:2014-01-23 19:02:42
【问题描述】:

我正在尝试制作一个简单的树应用程序,它接受用户的输入并根据输入将节点添加到树结构中。我希望树的每个节点都是通用模型的一个实例,称为节点。

一个条目最多有两个部分:一个父项,它是字符串的开头直到第一个括号,另一个子项,它在括号中。

例如,假设用户输入以下内容:

"animal(cat)"
"animal(dog)"
"dog(golden retriever)"
"organic_life_form(animal)"

这应该会生成一个这种结构的树:

organic_life_form
        |
     animal
   /         \
dog            cat
  |
golden retriever

我在定义“节点”模型时犯了一个错误,但我不确定如何修复它。

class Node(models.Model):
    name = models.CharField(max_length=200)
    parent = models.ForeignKey(Node)
    nodes = models.IntegerField(default=0)

    def __unicode__(self):
        return self.name 

显然我不允许使用另一个节点作为我的外键“父”,因为“节点”尚未定义。这似乎是一个非常基本的错误,但我仍然不明白为什么不允许这样做。

谁能解释为什么我不能使用另一个“节点”作为外键?如果这是一个失败的原因,有什么更好的方法来定义我想要的结构类型?

【问题讨论】:

    标签: python django tree nodes


    【解决方案1】:

    Node 在类定义中不可用,因为它尚未定义。为此,Django 允许您将名称用作引号中的字符串。

    但是,对于您的潜在问题,您可能应该查看现有的库,例如 django-mptt。

    【讨论】:

    • 其实我自己在尝试这个是为了学习,所以我会在没有现有库的情况下尝试这个。似乎应该有其他方法来建模我关心的结构,但我想不出任何方法。
    • 正如我所说,使用"Node" 而不仅仅是Node 可以让您使用当前的方法
    【解决方案2】:

    你也可以使用

    parent = models.ForeignKey("self")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-08
      • 2016-04-16
      • 1970-01-01
      • 2011-08-20
      • 2020-08-24
      • 1970-01-01
      • 2017-12-05
      • 2014-01-13
      相关资源
      最近更新 更多