Django通过外键和计数对象组

时间:2015-08-09 16:26:46

标签: python django orm group-by

我在我的数据库中存储了一个Url表,其结构如下:

[条目1]

Url: ForeignKey(Url)
Referer Url: http://facebook.com/post/123
User Agent: Mozilla etc...
IP: 123.123.123.123
Is under proxy?: True

所有条目与上述条目类似。

我需要按 Url 列对所有条目进行分组,然后计算具有相同 Url 列的条目数具有相同的用户代理,IP和Referer Url。

有没有办法用Django ORM做到这一点?

示例

具有相同 Url 列的条目:其中12个有XXX推荐,其中6个有YYY推荐,其中10个有XXX.XXX.XXX.XXX IP,其中100个有YYY.YYY .YYY.YYY IP

有人能解释一下这个过程背后使用的逻辑吗?

更新好的,我是靠自己做的。这是代码:

urls = Url.objects.all() # select all urls
    for url in urls: # for each url count how many times the same ip, useragent, etc... are repeated
        visits = VisitLog.objects.filter(url=url)
        visit_ip = visits.values('ip').annotate(ip_count=Count('ip'))
        visit_useragent = visits.values('useragent').annotate(useragent_count=Count('useragent'))
        visit_referring_url = visits.values('referring_url').annotate(referring_url_count=Count('referring_url'))
        print(visit_referring_url)

现在还有一种方法可以在没有这么多查询的情况下以更优雅的方式进行吗?

1 个答案:

答案 0 :(得分:2)

不,你不能使用ORM。您可能必须提取User Agent,IP和Referrer URL的所有独特组合。然后去获取与每个条目匹配的条目数。

您最终可能会使用raw或撰写custom SQL

首先想到的是对实例表运行一个选择,在所有四列中查找不同的值。然后需要使用这些结果来计算重复数。