2010-02-03 171 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

相关问题