2017-08-01 10 views
0

私のモデルがあります:ジャンゴ

class Category(models.Model): 
..... 
slug = models.SlugField(verbose_name=_('Slug')) 
description = RedactorField(verbose_name=_('Description')) 
parent = models.ForeignKey('self', null=True, blank=True, 
          default=None, verbose_name=_('Parent')) 

事は、私がDjangoRestFrameworkを使用して、APIのリソースを作成する必要がある、とシリアライザは、各カテゴリのチャイルズのカウントが含まれている必要があります。このような 何かが、私はgenerics.ListAPIViewなどの受信トレイDRFツールで作られた:

[ 
{ 
    "id": 1, 
    "created": "01-08-2017 10:42 UTC", 
    "modified": "01-08-2017 10:55 UTC", 
    "name": "Category_1", 
    "slug": "", 
    "description": "", 
    "parent": null, 
    "child_count": 12, 

}, 
{ 
    "id": 2, 
    "created": "01-08-2017 10:42 UTC", 
    "modified": "01-08-2017 10:55 UTC", 
    "name": "SubCategory_1_1", 
    "slug": "", 
    "description": "", 
    "parent": 1, 
    "child_count": 0, 
}, 
... 
] 

ので、クエリセット

Category.objects.annotate(child_count=models.Count('parent')) 

つもりは両親のカウントのみ(およびその常に1に等しいか、または0)を示し、 。

MPTTModel libがあります。これはおそらくこれを解決する可能性がありますが、プロジェクト固有の問題が存在するため使用できません。

答えて

0

これは動作するはずさ: Category.objects.annotate(child_count=Count('category_set'))

'category_set'あなたはparentフィールドにrelated_name='children'を追加する必要があり、その後、あなたがCount('children')を使用することができ、逆の関係でそれを使用する自動-生成Djangoの名前です。

+0

ほとんどの部分は、Count( 'category_set')の代わりにCount( 'category')です。しかし、私はすべての子どもとその子どもの数を知る必要があります。たとえば、Cat_1はCat_1_0とCat_1_1の親であり、同時にCat_1_1はCat_1_1_0とCat_1_1_1の親であるため、Cat_1には2つの子と2つの子孫があります(カウントする必要がある子孫の総数は4です)。 Count( 'category')には2しか表示されません。 –

+0

これを行う方法の1つは、 'Category'ツリーを反復して辞書に格納し(category_id:count)、それをキャッシュすることです新しい 'Category'を追加/削除すると、キャッシュされた値を無効にします。この方法では、毎回ツリーを反復することによってカウントを取得する必要はありません。 –