我有一个类别树,其中Items条目与该类别相关。所以这是我的模型文件:
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)
哪个应返回树,并在每个节点上加载属于节点的Items数。这看起来像文档中所述的django-mptt的标准功能。
但是,我收到了一个错误。以下是跟踪:
在Ubuntu 9.1中使用SVN django-mptt和django 1.1。
答案 0 :(得分: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”中放置八个内容,在“parent2”中放置一个内容将给出以下计数:
parent (14) +-- child1 (5) +-- child2 (8)
如果你想要一个只包含特定级别事物的计数(而不是层次结构中的事物),你将不得不修改最多的select语句。
答案 1 :(得分:0)
尝试使用:
Category.tree.add_related_count(Category.objects.all(), Item, 'category', 'q_c', cumulative=True)