python - Django 模型 : root node appears as child in unsaved nodes

标签 python django django-models

我正在尝试在 Django 中为树结构建模。这是我所拥有内容的简化版本:

from django.db import models

class Node(models.Model):
    parent = models.ForeignKey("Node", null=True)
    name = models.CharField(max_length=20)

    def child_cnt(self):
        return self.node_set.count()

    def __unicode__(self):
        return self.name

到目前为止一切顺利。有用。但是,如果我现在开始创建这样的层次结构:

from ....models import Node
root = Node()
root.name = "ROOT"
root.parent = None
root.save()

n = Node()
print n.child_cnt()
>> 1
print n.node_set.all()
[<Node: ROOT>]

那么根节点作为子节点在 n 中做了什么?我怎样才能避免这种情况?

一旦我调用了 n.save() 问题就消失了,但是在管理站点中看到一个节点初始化为 1 的 child_cnt 有点令人讨厌。

最佳答案

我知道这听起来很疯狂,但我花了几分钟试图解决您的问题,但在我尝试过的任何尝试中都没有奏效。 无论如何,对于 Tree ForeignKey,我在网上找到了另一个解决方案,这是一个处理此类 key 的完整库,https://github.com/django-mptt/django-mptt 你可以试试看,它可能适合你。我讨厌为这么小的东西添加一个库,但是我找不到更好的东西。

此外,如果您不想导入整个库,您可以只将 TreeForeignKey 引入您的代码。

关于python - Django 模型 : root node appears as child in unsaved nodes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10824074/

相关文章:

python - 属性错误: type object 'Product' has no attribute '_meta'

django - 字符串中的 Django 外键和不带字符串的 Django 外键有什么区别?

python - 在 Django 中使用 manage.py 从 CLI 清除数据库的最简单方法是什么?

python - 如何计算 Django 模型中产品的总价?

javascript - `$getjson` 从 Django 到 javascript 不起作用

django - 如何为 Django 的 TextField 在 South 指定默认值?

python - 如何在 Django 中进行分层验证?

python - 填充奇怪的行为,当有重复的列名时

python - 在python中排序项目

python - 如何为 numpy 矩阵生成干净的 x 和 y 轴?