2010-02-03 196 views
1

我有一個類別樹,與條目項目相關的類別。所以這是我的模型文件:在django-mptt中執行以下操作有什麼錯誤?

from django.db import models 
import mptt 

class Category(models.Model): 
nombre=models.CharField(max_length=70) 
padre=models.ForeignKey('self', blank=True, null=True) 

def __unicode__(self): 
    return self.nombre 

class Meta: 
    ordering = ['tree_id', 'lft'] 

# Create your models here. 

class Item(models.Model): 
    category=models.ManyToManyField(Category) 

try: 
mptt.register(Category, order_insertion_by=['nombre'], parent_attr='padre') 
except mptt.AlreadyRegistered: 
pass 

我使用ManyToManyField,因爲每個項目可以在多個類別。

現在,在我的應用程序中安裝'mptt'後。我想在shell下:

Category.tree.add_related_count(Category.tree.root_nodes(), Item, 
    'category', 'q_c', cumulative=True) 

應返回一棵樹,並加載屬於每個節點上的一個節點項目的數量。這看起來像文檔中所述的django-mptt的標準功能。

但是,我得到一個錯誤。以下是跟蹤:

http://pastebin.com/m69ed1937

使用SVN的django-MPTT和在Ubuntu 9.1 1.1 Django的。

+1

您的示例如下的文檔,但在文檔,它們具有類是一個外鍵,而不是一個多對多。 – 2010-02-05 00:48:53

+0

是的,我注意到了......我將其作爲問題發佈,以查看創作者是否有任何答案。 我剛試過用ForeignKey,它工作(因爲表是空的,它返回[])。也許我所要求的還沒有實現? – Ezequiel 2010-02-05 16:59:02

回答

1

我最終爲我正在手動處理的網站實施了一個非常類似的查詢。這裏的代碼:

tree = Table1.objects.extra(select={"tree_content_count": 
"""SELECT COUNT(DISTINCT %(join_table_fk1_name)s) 
     FROM %(join_table)s 
     WHERE %(join_table_fk2_name)s in 
     (
     SELECT id FROM %(data_table)s m2 where m2.tree_id = %(data_table)s.tree_id 
      and m2.lft between %(data_table)s.lft and %(data_table)s.rght 
    )""" % {params_dict_here} 
})

這似乎是伎倆。這是一個全層次計數;換句話說,把五件事情在「child1」,載「的child2」八兩件事,一個在「父」將爲下列罪狀:

parent (14) 
+-- child1 (5) 
+-- child2 (8)

如果你想有一個計數僅包括在特定層次的東西(而不是層次結構中它下面的東西),您將不得不修改最多的select語句。

+0

你能分享你如何實現這個?你能展示一個你的模型,視圖和模板的例子嗎?我試圖做同樣的事情,看到我的問題在這裏> http://stackoverflow.com/questions/14160416/django-count-items-and-ordered-by-parent-category-and-child-categories – 2013-01-07 13:57:38

0

嘗試使用:

Category.tree.add_related_count(Category.objects.all(), Item, 'category', 'q_c', cumulative=True) 
+0

心靈解釋爲什麼?它會幫助每個人更好地理解你的答案。 – 2013-06-06 15:47:27

相關問題