嗨,我有一个模型,我把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()