Django-ORM常用
去重统计 annotate
MM.objects.values_list(‘item’).annotate(Count(‘item’))
- 查询告警通知中,多少告警类型数量
from django.db.models import Count
from apps.monitor.models import AlertCal
obj = AlertCal.objects.values_list('type').annotate(Count('type'))
obj
Out[5]: <QuerySet [('sendtohubotapi', 1206), ('Email', 303)]>
ordery_by 排序
去重统计主机告警数,TOP 10
AlertCal.objects.filter(Q(time__range=['2020-10-22 00:00:00', '2020-10-22 23:59:59']) & Q(env='FAT')).values_list('hostname').annotate(cnt_host=Count('hostname')).order_by('-cnt_host')[:3]
Out[24]: <QuerySet [(' uatfat129134', 182), (' jrfat030228', 102), (' node100.xx.com', 51)]>
反向查询
class NginxModel(models.Model):
name = models.CharField(max_length=128, verbose_name="ng名称")
desc = models.CharField(max_length=128, default="", blank=True, verbose_name="ng描述")
class NginxConf(models.Model):
name = models.CharField(max_length=128, verbose_name="站点名称")
type = models.ForeignKey(NginxModel, on_delete=models.SET_NULL, blank=True, null=True, verbose_name="关联ng模块")
- 查询NginxModel有多少conf关联
from apps.ops_nginx.models import NginxModel
obj = NginxModel.objects.first()
obj.nginxconf_set.all().count()
Out[19]: 9
# 过滤状态是使用中的
obj.nginxconf_set.all().filter(status='running').count()
Out[21]: 5