1

カテゴリに関連する項目エントリを持つカテゴリ ツリーがあります。だから、これは私のモデルファイルです:

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 に答える