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

如何在Django中通过模型关联获取每个行业对应的职位数量

问题原因

你当前的实现失效是因为Industry模型本身没有定义jobs_count属性,也没有在查询数据集时提前注入统计值,所以模板无法读取到对应字段。

可选解决方案

方案1:模型层添加property属性(小数据量场景首选)

直接修改Industry模型,增加只读计算属性,改完即可直接在模板使用:

class Industry(models.Model):
    name=models.CharField(max_length=2000,null=True, blank=True)

    @property
    def jobs_count(self):
        # 外键默认反向关联名为小写模型名+_set,即job_set
        return self.job_set.count()

该方案实现成本最低,但遍历的Industry数量较多时会产生N+1查询问题,每次访问jobs_count都会单独请求一次数据库。

方案2:查询时注解统计(列表遍历场景首选,性能最优)

无需修改模型,仅在视图层查询Industry数据集时,通过Django内置的聚合注解提前把统计结果注入到实例中:
首先引入聚合函数:

from django.db.models import Count

将你视图中查询industry_2的代码改为:

industry_2 = Industry.objects.annotate(jobs_count=Count('job'))

该方案仅执行1次带统计逻辑的SQL查询,完全避免N+1问题,性能表现最好,是大部分场景下的最优选择。

方案3:物理存储统计字段(高频访问场景首选)

如果该统计值访问频率远高于Job数据的增删改频率,可以直接给Industry增加存储字段,通过信号自动更新数值:

  1. 首先修改Industry模型新增字段:
class Industry(models.Model):
    name=models.CharField(max_length=2000,null=True, blank=True)
    jobs_count = models.IntegerField(default=0, verbose_name="关联职位数量")
  1. 新增信号监听Job的增删改操作,自动更新对应行业的统计值:
from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver

@receiver(post_save, sender=Job)
@receiver(post_delete, sender=Job)
def update_industry_jobs_count(sender, instance, **kwargs):
    if instance.industry:
        instance.industry.jobs_count = instance.industry.job_set.count()
        instance.industry.save(update_fields=['jobs_count'])

该方案直接读取字段值无需额外查询,性能最高,但需要注意:批量增删改Job时Django信号不会触发,需要额外处理批量操作的统计更新逻辑。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:36:03