在Django中获取模型前三高频值并写入Dashboard模型
解决Django中统计Top3漏洞VID并填充仪表盘的问题
核心逻辑
由于clientvul模型对client和vid做了唯一约束,每个vid的出现次数等价于关联的不同client数量。我们需要完成三个核心步骤:统计各vid的关联客户端数、按数量取前3个vid的ID、将结果写入dashboard模型。
具体实现代码
1. 统计Top3 VID的查询逻辑
from django.db.models import Count from .models import clientvul, dashboard # 统计每个VID关联的客户端数量,按数量降序取前3 top_vids = clientvul.objects.values('vid') \ .annotate(client_count=Count('client')) \ .order_by('-client_count')[:3] # 提取VID的ID,不足3个时用0填充(匹配dashboard字段默认值) top_vid_ids = [item['vid'] for item in top_vids] while len(top_vid_ids) < 3: top_vid_ids.append(0)
2. 填充Dashboard模型
假设仪表盘只需维护一条全局记录,用get_or_create确保记录存在并更新:
# 获取或创建唯一的仪表盘记录(可根据业务调整匹配条件) dashboard_record, _ = dashboard.objects.get_or_create(pk=1) # 更新topvul字段 dashboard_record.topvul1 = top_vid_ids[0] dashboard_record.topvul2 = top_vid_ids[1] dashboard_record.topvul3 = top_vid_ids[2] dashboard_record.save()
3. 配置每日定时任务
以django-crontab为例实现定时执行:
- 安装依赖:
pip install django-crontab - 在
settings.py中添加django_crontab到INSTALLED_APPS - 在app下创建
tasks.py编写任务函数:
# tasks.py from django.db.models import Count from .models import clientvul, dashboard def update_dashboard_top_vuls(): # 统计Top3 VID top_vids = clientvul.objects.values('vid') \ .annotate(client_count=Count('client')) \ .order_by('-client_count')[:3] top_vid_ids = [item['vid'] for item in top_vids] while len(top_vid_ids) < 3: top_vid_ids.append(0) # 更新仪表盘 dashboard_record, _ = dashboard.objects.get_or_create(pk=1) dashboard_record.topvul1 = top_vid_ids[0] dashboard_record.topvul2 = top_vid_ids[1] dashboard_record.topvul3 = top_vid_ids[2] dashboard_record.save()
- 在
settings.py中配置定时规则(每天凌晨2点执行):
CRONJOBS = [ ('0 2 * * *', '你的应用名.tasks.update_dashboard_top_vuls', '>> /var/log/dashboard_update.log 2>&1') ]
- 激活定时任务:
python manage.py crontab add
注意事项
- 若需仅统计活跃漏洞,在查询中添加
.filter(isactive=True)即可。 - 若仪表盘需要多维度记录(如按部门、按时间),需调整
get_or_create的匹配条件,适配业务逻辑。 - 定时任务日志路径可根据服务器配置修改,方便排查执行异常。
内容的提问来源于stack exchange,提问作者xMonkey1337
相关产品推荐
相关产品推荐

