1

我有一个类别树,其中包含与该类别相关的 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”之后。我正在外壳中尝试以下操作:

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

它应该返回一棵树,并在每个节点上加载属于一个节点的项目数。如文档中所述,这似乎是 django-mptt 的标准功能。

但是,我得到一个错误。以下是痕迹:

http://pastebin.com/m69ed1937

在 Ubuntu 9.1 中使用 SVN django-mptt 和 django 1.1。

4

2 回答 2

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”中放入 5 个东西,在“child2”中放入 8 个东西,在“parent”中放入 1 个东西,将得到以下计数:

父母 (14)
+-- 孩子1 (5)
+-- 孩子2 (8)

如果您想要一个仅包括特定级别的事物(而不是层次结构中位于其下方的事物)的计数,则必须修改最里面的 select 语句。

于 2012-09-09T00:14:06.720 回答
0

尝试使用:

Category.tree.add_related_count(Category.objects.all(), Item, 'category', 'q_c', cumulative=True)
于 2013-06-06T15:23:30.470 回答