按字段获取不同的Queryset值

我有这个模型:

class Visit(models.Model): timestamp = models.DateTimeField(editable=False) ip_address = models.IPAddressField(editable=False) 

如果用户在一天内访问多次, 如何根据ip字段筛选唯一的行? (我想要今天的独特访问)

 today = datetime.datetime.today() yesterday = datetime.datetime.today() - datetime.timedelta(days=1) visits = Visit.objects.filter(timestamp__range=(yesterday, today)) #.something? 

编辑:

我看到我可以使用:

 Visit.objects.filter(timestamp__range=(yesterday, today)).values('ip_address') 

得到只有ip字段的ValuesQuerySet。 现在我的QuerySet看起来像这样:

 [{'ip_address': u'127.0.0.1'}, {'ip_address': u'127.0.0.1'}, {'ip_address': u'127.0.0.1'}, {'ip_address': u'127.0.0.1'}, {'ip_address': u'127.0.0.1'}] 

如何过滤这个唯一性没有评估QuerySet和采取数据库命中?

 # Hope it's something like this... values.distinct().count() 

你想要的是:

 Visit.objects.filter(stuff).values("ip_address").annotate(n=models.Count("pk")) 

这是做所有ip_addresses,然后获得每个ip地址的主键(又名行数)的计数。

Alex答案我也有每个项目n:1。 即使有一个distinct()子句。

这很奇怪,因为这是返回项目的好数字:

 Visit.objects.filter(stuff).values("ip_address").distinct().count() 

但是当我迭代“Visit.objects.filter(stuff).values(”ip_address“)。distinct()”我得到更多的项目和一些重复…

编辑:

过滤条款给我带来麻烦。 我正在过滤另一个表字段和一个SQL JOIN被打破了独特的东西。 我使用这个提示来查看真正使用的查询:

 q=Visit.objects.filter(myothertable__field=x).values("ip_address").distinct().count() print q.query 

然后我恢复了我正在做的查询和filter有一个不依赖于任何“访问”ID联合的类。

希望这可以帮助