首页 > 解决方案 > django模型找到过滤器计数最小的地方

问题描述

嗨,我有一个模型,我将 ip 保存在四列中:

class IPAbstract(Audit):
    first = models.PositiveSmallIntegerField(validators=[MinValueValidator(1), MaxValueValidator(254)])
    second = models.PositiveSmallIntegerField(validators=[MinValueValidator(0), MaxValueValidator(254)])
    third = models.PositiveSmallIntegerField(validators=[MinValueValidator(0), MaxValueValidator(254)])
    forth = models.PositiveSmallIntegerField(validators=[MinValueValidator(0), MaxValueValidator(254)])

   

    class Meta:
        abstract = True

我所有的 ips 都以 10.0.0.0,20.0.0.0,30.0.0.0,40.0.0.0 开头我想找到我的 ip 范围的最小行数,我可以这样做:

IPAbstract.objects.filter(first=10).count()
IPAbstract.objects.filter(first=20).count()
IPAbstract.objects.filter(first=30).count()
IPAbstract.objects.filter(first=40).count()

并将它们相互比较以找出哪些行数最少。我想看看是否有其他方法可以找到我的答案?

标签: djangodjango-models

解决方案


您可以使用:

from django.db.models import Count

IPAbstract.objects.values('first').annotate(
    count=Count('pk')
).order_by('number')

这将生成一个QuerySet看起来像这样的字典:

<QuerySet [
    { 'first': 30, 'count': 5 },
    { 'first': 10, 'count': 9 },
    { 'first': 40, 'count': 11 },
    { 'first': 20, 'count': 20 },
]>

first没有出现在记录中的值IPAbstract当然不会被列出。

因此,您可以获得具有最小值的字典'count'

from django.db.models import Count

IPAbstract.objects.values('first').annotate(
    count=Count('pk')
).order_by('first', 'number').first()

推荐阅读