Django以及如何检查对象是否有子节点

时间:2012-09-05 15:17:06

标签: django parent foreign-key-relationship

作为Django / python世界中的新手,我找不到检查对象是否有孩子的方法。

一个例子:

Class MyItems
        title = models.CharField(max_length=50)
        parent = models.ForeignKey('self',null=True, blank=True,related_name='subitems')

然后在我的模板中:

{% for item in MyItems %}
<li> {{ item.title }} </li>
    {% if item **IS A PARENT OF CHILDREN** %}
        <p>This is what I want</p>
    {% endif %}
{% endfor %}  

我可以看到一个项目是否有父母没有问题,但如何以其他方式做,告诉一个项目是否是其他项目的父项?

谢谢!

2 个答案:

答案 0 :(得分:2)

如果你想在你的对象之间建立一个递归的父子关系,你应该看看使用MPTT

http://django-mptt.github.com/django-mptt/

<ul class="root">
{% recursetree nodes %}
    <li>
        {{ node.name }}
        {% if not node.is_leaf_node %}
            <ul class="children">
                {{ children }}
            </ul>
        {% endif %}
    </li>
{% endrecursetree %}
</ul>

在这里的食谱中谈到: https://code.djangoproject.com/wiki/ModifiedPreorderTreeTraversal

要了解MPTT在数据级别的工作原理,请查看http://en.wikipedia.org/wiki/Nested_set_model

显而易见的解决方案的问题是,对于每个额外级别的孩子,需要另一个查询 - 效率极低。

# this is an additional query AND will not be recursive.
{% if item.child_set.all.count > 0 %} 

答案 1 :(得分:0)

如果我正确地理解了这个问题,那应该就这么简单:

{% if item.subitems.exists %}