【问题标题】:django rest framework category parent and child countdjango rest框架类别父子计数
【发布时间】:2017-08-01 12:50:04
【问题描述】:

这是我的模型:

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 库,可能可以解决这个问题,但我不能使用它,因为存在一些项目特定的问题。

【问题讨论】:

    标签: django django-rest-framework serialization


    【解决方案1】:

    这应该有效: Category.objects.annotate(child_count=Count('category_set'))

    'category_set' 是 django 自动生成的名称,以便在反向关系中使用它,您应该将 related_name='children' 添加到 parent 字段,然后您可以使用 Count('children')

    【讨论】:

    • 几乎,部分解决方案是 Count('category') (而不是 Count('category_set') )。但事情是我需要知道所有孩子的数量,以及他们孩子的孩子。例如: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 个。
    • 我认为一种方法是遍历 Category 树并将计数保存在字典中 (category_id: count) 然后缓存它。然后您可以从缓存的字典中获取计数。添加/删除新的Category 后,缓存值无效。这样,您就不需要每次都通过遍历树来获取计数。
    猜你喜欢
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 2022-06-25
    • 2016-08-10
    相关资源
    最近更新 更多