2012-09-05 79 views
1

作爲Django/python世界中的新手很多我無法找到一種方法來檢查對象是否有子對象。Django以及如何檢查對象是否有子女

一個例子:

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

如果你想你應該看看使用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 %} 
+0

謝謝!這可能只是伎倆。不幸的是,mptt不起作用。 「'模塊'對象沒有屬性'TreeForeignKey'」是我嘗試使用它時得到的所有東西。 – QlliOlli

+0

@ user1649481這都是因爲你需要特定的mptt模型而不是你的常規模型 –

+0

@ user1649481 - 請按照文檔。它會爲你工作。 http://django-mptt.github.com/django-mptt/models.html#setting-up-a-django-model-for-mptt –

0

如果我理解正確的問題,它應該是這樣簡單:

{% if item.subitems.exists %}