如何在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
相关产品推荐
相关产品推荐

