mptt具有将树模型作为外键的不同模型实例的计数

时间:2016-03-01 07:55:15

标签: django django-mptt

在网上商店中,我使用django-mptt来表示具有多个级别的产品类别。我也有各自属于某一类别的产品。

现在我想像这样想象类别树:

all(18)
- edible (10)
-- food (4)
-- drink (6)
- inedible (8)
-- wood (3)
-- rock (5)

其中范围中的数字是每个类别的产品数。

我能够可视化类别树。我也可以将产品数量放在类别名称后面,但我这样做的方式似乎非常低效。我在类别模型中基本上有一个get_number_of_products()方法,它返回一个类别的产品数量。但每次都需要一个新的数据库查询。

解决这个问题的一种方法是使用缓存,因为我不经常更改产品数量,但我更喜欢一种需要较少数据库查询的方法来获取具有产品数量的树。

2 个答案:

答案 0 :(得分:2)

你想要的是add_related_count

Category.objects.add_related_count(
   Category.objects.get_descendants(include_self=True),  # Queryset
   Product,  # Related mobile
   'category',  # Name of the foreignkey field
   'count',  # Name of the property added to the collection
    cumulative=True)  # Cumulative or not.

例如在管理员中你可以使用类似的东西:

class CategoryAdmin(DraggableMPTTAdmin):
    mptt_indent_field = "name"
    list_display = ('tree_actions', 'indented_title', 
                    'related_products_count', 'related_products_cumulative_count')
    list_display_links = ('indented_title',)

    def get_queryset(self, request):
        qs = super().get_queryset(request)

        # Add cumulative product count
        qs = Category.objects.add_related_count(
                qs,
                Product,
                'category',
                'products_cumulative_count',
                cumulative=True)

        # Add non cumulative recipe count
        qs = Category.objects.add_related_count(qs,
                 Product,
                 'categories',
                 'products_count',
                 cumulative=False)
        return qs

    def related_products_count(self, instance):
        return instance.products_count
    related_product_count.short_description = 'Related products (for this specific category)'

    def related_products_cumulative_count(self, instance):
        return instance.products_cumulative_count
    related_products_cumulative_count.short_description = 'Related products (in tree)'

答案 1 :(得分:0)

我的回答与Django-Oscar有关,但你可能会发现它很有用

{{ for tree category in tree_categories }}是一个分类类,因此可以通过

获得孩子
{{ tree_category.get_num_children }}