Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django-基于字段出现次数的过滤器_Python_Django_Django Queryset - Fatal编程技术网

Python Django-基于字段出现次数的过滤器

Python Django-基于字段出现次数的过滤器,python,django,django-queryset,Python,Django,Django Queryset,我有一个模型跟踪广告的印象数量 class Impression(models.Model): ad = models.ForeignKey(Ad, on_delete=models.CASCADE) user_ip = models.CharField(max_length=50, null=True, blank=True) clicked = models.BooleanField(default=False) time_created = models.D

我有一个模型跟踪广告的印象数量

class Impression(models.Model):
    ad = models.ForeignKey(Ad, on_delete=models.CASCADE)
    user_ip = models.CharField(max_length=50, null=True, blank=True)
    clicked = models.BooleanField(default=False)
    time_created = models.DateTimeField(auto_now_add=True)
我想找到所有有超过1000次印象的
用户\u ip
。换句话说,如果一个
用户\u ip
出现在1000多个
Impression
实例中。我该怎么做?我为此编写了一个函数,但它效率很低,速度也很慢,因为它会在每个印象中循环

def check_ip():
    for i in Impression.objects.all():
        if Impression.objects.filter(user_ip=i.user_ip).count() > 1000:
            print(i.user_ip)

您应该能够通过聚合在一个查询中完成此操作。。可以按如下方式过滤聚合值(如
Count()
):

from django.db.models import Count

for ip in Impression.objects.values('user_ip').annotate(ipcount=Count('user_ip')).filter(ipcount__gt=1000):
    # do something

Django QuerySet有一个
annotate()
方法,它支持您尝试执行的操作

 from django.db.models import Count

 Impression.objects.values('user_ip')\
     .annotate(ip_count=Count('user_ip'))\
     .filter(ip_count__gt=1000)
这将为您提供一个查询集,当用作iterable时,该查询集返回带有“user\u ip”和“ip\u count”键的词典

要了解这里发生了什么,您应该看看Django的聚合指南:(特别是它解释了
注释
如何与
交互)

生成的SQL类似于:

SELECT "impression"."user_ip", COUNT("impression"."user_ip") AS "ip_count"
FROM "impression"
GROUP BY "impression"."ip"
HAVING COUNT("impression"."ip") > 1000;

伟大的我将修复导入。这应该适用于Django的任何DB后端,而不仅仅是Postgre。它没有在上使用DISTINCT。你是对的,我将字段传递给values()与字段传递给DISTINCT()混为一谈。。。