You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django模板中显示每个Farm关联的Animal数量?

问题:Django模板中如何显示每个农场的关联动物数量?

我有两个Django模型Farm和Animal,通过ForeignKey关联,一个农场包含多个动物。现在在前端模板中循环遍历农场生成表格,需要在表格里显示每个农场的动物数量。

模型代码

class Farm(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True, default=None)
    square_meter = models.IntegerField(blank=True, null=True)
    friendly_name = models.CharField(max_length=24, blank=True)
    kml = models.FileField(upload_to=user_directory_path_kml, null=True, blank=True)

class Animal(models.Model):
    class Meta:
        verbose_name_plural = "Animals"
    
    farm = models.ForeignKey(Farm, on_delete=models.CASCADE, blank=True, null=True, default=None)
    name = models.CharField(max_length=24, blank=True)
    datetime = models.DateTimeField(blank=True, null=True, default=datetime.now)
    tracking = models.BooleanField(default=False)
    kg = models.IntegerField(blank=True, null=True)

当前模板代码(需补充动物数量的位置)

{% for farm in farms %}
    <tr>
       <th scope="row">{{forloop.counter}}</th>
       <td>{{farm.friendly_name}}</td>
       <td>{{farm.square_meter}}</td>
       <td>{{farm. }}</td> {# 这里需要显示动物数量 #}
    </tr>
{% endfor %}

解决方案

方法1:直接使用反向关联计数

Django会为ForeignKey自动生成反向关联属性,默认格式为[关联模型小写]_set,这里对应animal_set。直接在模板中调用其count属性即可:

修改模板对应行:

<td>{{ farm.animal_set.count }}</td>

这种方法简单直接,但农场数量较多时会触发N+1查询问题(每个农场单独查询一次动物数量),性能较差。

方法2:用annotate提前统计(推荐)

通过Django的annotate结合Count聚合函数,在查询农场时一次性统计好每个农场的动物数量,避免重复查询:

视图代码修改

from django.db.models import Count
from .models import Farm

def your_view(request):
    # 为每个Farm对象添加预统计的animal_count字段
    farms = Farm.objects.annotate(animal_count=Count('animal'))
    return render(request, 'your_template.html', {'farms': farms})

模板代码修改

直接调用预统计好的字段:

<td>{{ farm.animal_count }}</td>

这种方法仅需一次数据库查询,性能更优,适合数据量较大的场景。


内容的提问来源于stack exchange,提问作者haduki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 22:25:21