django只显示模板中m2m的最大值

cngwdvgl  于 2023-06-25  发布在  Go
关注(0)|答案(2)|浏览(115)

嘿!
我有一个多列的表视图,其中一列包含来自模型的m2m字段。我不希望所有的值(如果多个值/条目是给定的m2m)只有最高的。
示例:

  • 1890个糖果
  • 30个糖果
  • 300000个糖果

我只想显示该单元格中的300000个糖果,而不是所有3个值。

{% for candymarket in mall %}
    <td>
        {% for bon in candymarket.bonbon_color.all %}
             {{bon.value}} | {{bon.color}}
        {% endfor %}
   </td>
{% endfor %}

如何在模板内部进行过滤?我仍然希望能够在详细视图中获取所有值。
是否有类似{% if bon.value|length > 200 %}的东西只与is max一起使用?
任何帮助或链接到一个文档是赞赏!:)

class CandyMarket(models.Model):
    name = models.CharField(
        max_length = 500,
        unique = True
    )
    bonbon= models.ManyToManyField(
        Bon,
        verbose_name = "BON",
        through = "BonForCandyMarket",
        blank = True,
        related_name = "bonbon_in_market"
    )

class BonForCandyMarket(models.Model):
    market= models.ForeignKey(
        Candymarket,
        on_delete = models.PROTECT,
        related_name = "bonbon_color"
    )
    bon= models.ForeignKey(
        Bon,
        on_delete = models.PROTECT,
        related_name = "market_with_bonbon"
    )
    value= models.PositiveSmallIntegerField(
        blank=True,
        null=True
    )

class Bon(models.Model):
    description_english = models.CharField(
        max_length = 500,
        unique = True
    )
nbysray5

nbysray51#

您可以尝试last内置

{% for candymarket in mall %}
    <td>
        {% with candymarket.bonbon_color.all|last as highest_bon %}
            {{ highest_bon.value }} | {{ highest_bon.color }}
        {% endwith %}
    </td>
{% endfor %}

并在BonForCandyMarket型号Meta中设置默认顺序

class BonForCandyMarket(models.Model):
    ...

    class Meta:
        ordering = ["-value"]
6tdlim6h

6tdlim6h2#

一般情况下,最好不要在template内部处理此类操作。如果是查询相关的数据,那么尽量在view中保留尽可能多的数据。在模板文件中,逻辑应仅用于渲染组件。
可以将aggregate数据转换为您的查询。在这种情况下称为annotation(即每个对象的聚合):
views.py

from django.db.models import Max

def candy_mall(request):
    qs = (
        CandyMarket.objects.all()
        .annotate(highest_bon=Max("bonbon__market_with_bonbon__value"))
    )
    context={'mall': qs}
    return render(request, 'candy_mall.html', context=context)

candy_mall.html

...
<body>
    {% for candymarket in mall %}
    <div>
        <h1>{{candymarket.name}}</h1>
        <p>{{candymarket.highest_bon}}</p>
    </div>
    {% endfor %}
</body>
...

相关问题