代码之家  ›  专栏  ›  技术社区  ›  Scott

按字段获取queryset的不同值

  •  42
  • Scott  · 技术社区  · 15 年前

    我有这个模型:

    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字段的值。现在我的查询集如下所示:

    [{'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'}]
    

    如何在不评估查询集和进行db命中的情况下筛选此唯一性?

    # Hope it's something like this...
    values.distinct().count()
    
    2 回复  |  直到 8 年前
        1
  •  36
  •   Alex Gaynor    15 年前

    你想要的是:

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

    这样做的目的是获取所有IP地址,然后获取每个IP地址的主键计数(即行数)。

        2
  •  16
  •   Guillaume Gendre    9 年前

    在亚历克斯的回答中,每个项目我都有N:1。即使使用distinct()子句。

    这很奇怪,因为这会返回大量的物品:

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

    但当我迭代“visit.objects.filter(stuff.values)”.distinct()时,我得到了更多的项和一些重复项…

    编辑:

    筛选子句给我带来了麻烦。我正在用另一个表字段进行筛选,并进行了一个SQL联接,它破坏了不同的内容。 我使用这个提示来查看真正使用的查询:

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

    然后,我恢复了witch上的类,我正在进行查询和筛选,以获得一个不依赖于任何“访问”ID的联接。

    希望这有帮助