如何在Django Models中实现统计同资质人员数量的计数器
Django资质统计功能实现方案
1. 先修正模型配置错误
你当前定义的Kwalificaties模型里手动设置了objects = None,会导致Django ORM查询能力失效,首先删除这行代码:
class Kwalificaties (models.Model): # 删掉objects = None这行 TREIN_SOORTEN = ( ('Traxx', 'Traxx'), ('Intercity Direct', 'Intercity Direct'), ('Intercity Nieuwe Generatie', 'Intercity Nieuwe Generatie'), ('Intercity Rijthuig', 'Intercity Rijthuig') ) E_H_B_O = ( ('Wel', 'Wel'), ('Niet', 'Niet'), ) EXTRA_KENNIS = ( ('Bio werkzaamheden', 'Bio werkzaamheden'), ('Kuil werkzaamheden', 'Kuil werkzaamheden'), ('Aardwind werkzaamheden', 'Aardwind werkzaamheden'), ('Airco Monteur', 'Airco Monteur'), ('Z.Z-Deuren Monteur', 'Z.Z-Deuren Monteur'), ('Vooropnamen Elektrisch', 'Vooropnamen Elektrisch'), ('Rijbevoegd Monteur', 'Rijbevoegd Monteur'), ('MTC', 'MTC'), ('EBKC', 'EBKC'), ('Heftruck kwalificatie', 'Heftruck kwalificatie'), ('Hoogwerker kwalificatie', 'Hoogwerker kwalificatie') ) naam = models.ForeignKey(Personeel, null=True, on_delete=models.SET_NULL) treinen = MultiSelectField(max_length=200, choices=TREIN_SOORTEN) ehbo = MultiSelectField(max_length=200, choices=E_H_B_O) extra = MultiSelectField(max_length=200, choices=EXTRA_KENNIS)
2. 重写视图统计逻辑
你原来的视图使用annotate的方式完全不符合需求,直接通过ORM过滤符合条件的资质记录计数即可,因为每一条Kwalificaties记录对应一个人员,过滤后计数就是持有对应资质的总人数:
def kwalificatietotaal(request): # 统计持有ehbo资质的人数,MultiSelectField用contains查询匹配值 ehbo_count = Kwalificaties.objects.filter(ehbo__contains='Wel').count() # 如果需要统计其他资质,同理扩展,比如统计持有Heftruck kwalificatie的人数 heftruck_count = Kwalificaties.objects.filter(extra__contains='Heftruck kwalificatie').count() # 把统计结果传到模板 context = { 'ehbo_count': ehbo_count, 'heftruck_count': heftruck_count } return render(request, 'accounts/kwalificatieTotaal.html', context)
3. 模板展示示例
在kwalificatieTotaal.html里直接调用传递的统计值即可:
<p>持有EHBO资质的总人数:{{ ehbo_count }}</p> <p>持有叉车资质的总人数:{{ heftruck_count }}</p>
如果需要批量统计所有EXTRA_KENNIS里的资质人数,可以用循环批量生成统计值再传到模板,不需要手动逐个写过滤逻辑。
内容的提问来源于stack exchange,提问作者UGC61
相关产品推荐
相关产品推荐

