2010-01-13 80 views
7

我試圖在Django的維基使用類似類別實施this one。我想知道Django的搜索方式是如何拉取與父類關聯的所有對象。例如,如果我有一個「電視」類別,並且它有子類別「LED」,「LCD」和「等離子」,我將如何輕鬆查詢所有電視而無需遞歸查看所有子類別和子子類別(如果有是任何)。Django的類別和子類別的搜索

代碼明智的,我想是這樣的:

class Item(models.Model): 
    name = ... 
    ... 
    category = models.ForeignKey(Category, null=True, blank=True) 

所以這種類型的實現是有沒有簡單的方法做什麼,我需要的,或者是有其他更好的解決辦法?

謝謝!您正在使用的Category模型它被你所引用的頁面上使用的相同方式

+0

項目可以在多個類別? – czarchaic 2010-01-14 00:21:45

+0

不是他們只能在一個類別中,但他們也會是父類別(類似於繼承) – 2010-01-14 02:23:23

回答

8

如果要執行嚴格的類別和子類別,但也必須與結果進行快速搜索的能力像你描述的,你可能要做出一個「標籤」表,其中你實際上並沒有讓用戶標記自己的項目,而是隻要您將一個類別分配給某個項目,您就可以將該項目的所有父類別填充到該項目的標籤表格中,直至該類別樹的根節點。

例如,如果您有以下幾點: alt text http://img509.yfrog.com/img509/9845/photoho.jpg

標記表看起來是這樣的:

id | tag_name | tv_id 
    1 |  "tv"  |  1 
    2 |  "sd"  |  1  
    3 |  "crt" |  1 
    4 |  "tv"  |  2 
    5 |  "HD"  |  2 
    6 |  "LCD" |  2 
    7 |  "tv"  |  3 
    8 |  "HD"  |  3 
    9 | "plasma" |  3 

現在,您的查詢集看起來就像items=Item.objects.filter(tag='TV')

5

假設,它似乎是一個類別「TV」將是一個Category實例與空parent,和「等離子」 &「LCD '將'Category作爲父母'TV'類別的實例。

>>> tv=Category(name="TV") 
>>> tv.save() 
>>> lcd=Category(name="LCD", parent=tv) 
>>> lcd.save() 
>>> plasma=Category(name="Plasma", parent=tv) 
>>> plasma.save() 

創建一些項目

>>> vizio=Item(name="Vizio", category=lcd) 
>>> vizio.save() 
>>> plasmatron=Item(name="PlasmaTron", category=plasma) 
>>> plasmatron.save() 

獲得該項目的queryset

>>> items=Item.objects.filter(category__parent=tv) 

>>>> items=Item.objects.filter(category__parent__name='TV') 

這看起來就像是在你需要什麼球場?

+0

這是否能夠做子類別?例如,如果Vizio實際上是另一個類別,然後有這樣一個項目: specific_model_number = Item(name =「model43534」,category = vizio) would not「items = Item.objects.filter(category__parent =電視)「 不返回結果集中的specific_model_number對象? – 2010-01-14 14:50:16

+0

你可以編輯你的文章,或添加一個你將使用的代碼類型的答案,並概述你的擔憂?我正在試圖準確理解你需要什麼。例如,在上面的queryset中,當循環它時,每個項目都會有一個名稱和一個「Category」。在您的應用程序中是否有可能將vizio作爲父類(即子子類)? – czarchaic 2010-01-14 15:03:10

+0

是一個類別可以讓vizio作爲父類。我擔心的是,查詢集不會返回類別樹子集中的每個項目。如果我有一個查詢集「category__parent = tv」,即使它們是樹中的2個節點,我是否還會得到所有返回的「vizio」項?我不知道如何編輯帖子以更好地解釋它,所以我很抱歉,因爲它很混亂,我非常感謝你的幫助。 – 2010-01-14 15:25:04

0

如果您正在使用Django - 類別,它採用MPTT那麼你就可以做到以下幾點:

Entry.objects.filter(category__in=category.get_descendants(True))