按字段获取不同的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联合的类。
希望这可以帮助