2013-02-27 80 views
2

我有一個模型,在我的Django項目如下:遍歷父ForeignKey的

class Category(models.Model): 
    parentCategory = models.ForeignKey(Category,null=True,blank=True) 
    category = models.CharField(max_length=255) 

    def __unicode__(self): 
     return self.category 

我使用它來設置類別heirachy。有些類別的父類別有一個父類別也有一個父類別等。我想知道如何循環這個結構在方法?

乾杯, 本

UPDATE: 下面是我的結構,我的類別表:

Parent 
Parent -> Sub Parent 
Parent -> Sub Parent -> Sub Sub Parent 

從阿米爾阿德南的 「GET_NAME」 函數返回:

Parent 
Sub Parent -> Sub Sub Parent 
Sub Sub Parent 

我需要它像這樣顯示:

Parent 
Parent -> Sub Parent 
Parent -> Sub Parent -> Sub Sub Parent 

任何想法?

+0

此外,如果你想擁有自我指涉鍵,你可以做到這一點'models.ForeignKey(「自我」,空=真,空=真)' – 2013-02-27 21:23:07

回答

3

你所描述的是一個樹狀結構,並遍歷的遞歸外鍵關係的所有父元素不幸的是一個非常昂貴的操作;父母的每次查找都需要一次數據庫命中,因爲其他答案顯示了做法。

我會建議你做的卻是用一個表結構,可實現有效的樹查詢。有幾種方法可以做到這一點,但要指出你正確的方向,我會建議看看django-mpttdjango-treebeard

例如,使用Django的MPTT你可以用下面的一般結構,這隻會導致一個額外的數據庫命中查詢目標類別的所有祖先實現這一目標。

from django.db import models 
from mptt.models import MPTTModel, TreeForeignKey 


class Category(MPTTModel): 
    name = models.CharField(max_length=255) 
    parent = TreeForeignKey('self', null=True, blank=True, related_name='children') 

    def __unicode__(self): 
     ancestors = self.get_ancestors(ascending=False, include_self=True) 
     return ' -> '.join(category.name 
          for category in ancestors) 
+0

非常感謝您的幫助。 – 2013-03-03 06:33:14

+1

更多示例在這裏:https://code.djangoproject.com/wiki/ModifiedPreorderTreeTraversal – 2013-03-07 02:55:32

3

如何..

def __unicode__(self): 
     str = self.category 
     obj = self 
     while obj.parentCateogry: 
      str += " " + obj.parentCategory.category 
      obj = obj.parentCategory 
     return str 
1

你可以這樣說:

class Category(models.Model): 
    parentCategory = models.ForeignKey('self', null=True, blank=True, 
     related_name="categories") 
    category = models.CharField(max_length=255) 

    def get_name(self, obj, name=''): 
     name += ' - ' + obj.category 
     categories = obj.categories.all() 
     if categories: 
      for category in categories: 
       name = self.get_name(category, name) 
      return name 
     else: 
      return name 

    def __unicode__(self): 
     return self.get_name(self).strip(' - ').strip() 
+0

嗯差不多了..除非它是一種逆轉..如果它是父母,則顯示孩子..但孩子不會顯示父母。我其實只是想讓它向父母顯示它是否有一個。 – 2013-02-28 02:26:13