【问题标题】:How to get 3rd level Object count in Django如何在 Django 中获取第三级对象计数
【发布时间】:2015-09-09 04:53:47
【问题描述】:

我正在为 Django 上的一个小型电子市场项目构建部分、类别和子类别的列表。

我有一个这样的模型:

Section > Category (FK Section) > SubCategory (FK Category) > ShopProduct (FK SubCategory)

问题是我有许多为空的类别(和子类别),因此我过滤查询集中的数据:

{% if section.shopcategory_set.count > 0 %}

如果分配给此部分的类别超过 1 个,它将过滤这些部分。 (但如果任何项目分配得更深,它不会过滤)

所以,我想从第一级循环中计算最终对象

类似:

{% for section in sections %}
    {% if section.category_set.subcategory_set.shopproduct_set.count > 0 %}
    {{ section.name }}
    {% endif %}
{% endfor %}

【问题讨论】:

  • 这样做会使您的查询很多变慢,这样做的好处可能不会超过这个......
  • @Sayse 我接受它,但我认为空链接更糟糕......

标签: python django


【解决方案1】:

一般原则是从您要检索的对象开始,或者在这种情况下计数。因此,您需要从 ShopProduct 开始并遵循关系。在这样的观点中:

ShopProduct.objects.filter(subcategory__category__section=my_section)

但是,你不能在模板中这样做,因为你不能调用带参数的方法。所以你需要把它定义为Section类的一个方法,用self替换my_section,然后你可以做(​​例如){{ section.get_product_count }}。

【讨论】:

  • 如果我按照你的方式做,然后调用像 {% for product in products %} product.{% endfor %} 这样的循环,它将调用按部分过滤的商店产品,也许我无法解释我的问题。目的是排除 Empty Section(HAS 类别,HAS 子类别,但子类别中没有产品的部分)
  • 好吧,你只需要在最后加上.count()。那不行吗?
  • “所以你需要将它定义为 Section 类的方法,用 self 替换 my_section”你能告诉 mw 如何制作那个类吗?
  • args['sections'] = ShopSection.objects.all().order_by('name') //// args['secprod'] = ShopProduct.objects.filter(shop_product_category__category__section = self) ///// 返回“全局名称'self'未定义”
  • 我说你应该在模型类上写一个方法——即def get_product_count(self): return ShopProduct...
猜你喜欢
  • 1970-01-01
  • 2019-08-24
  • 1970-01-01
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
  • 2011-03-24
  • 2011-02-18
  • 2011-06-20
相关资源
最近更新 更多