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

我的所有ip都以10.0.0.0、0.0.0.0、0.0.0.0和0.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()

并且将它们相互比较以找出哪个具有最小行。我想看看是否还有其他方法可以找到我的答案?

您可以使用:

from django.db.models importCount
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 },
]>

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

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

from django.db.models importCount
IPAbstract.objects.values('first').annotate(
count=Count('pk')
).order_by('first', 'number').first()

最新更新