Django ORM最具价值

时间:2014-03-11 13:02:15

标签: django data-annotations django-orm

我有一个模型基本上我跟踪用户的活动。我想知道用户访问的页面是什么MOST.

这是我的模态。

class Visitor(models.Model):
    session_key = models.CharField(max_length=40, primary_key=True)
    user = models.ForeignKey(User, related_name='visit_history', null=True, editable=False)
    ....

class Pageview(models.Model):
    visitor = models.ForeignKey(Visitor, related_name='pageviews')
    url = models.CharField(max_length=500)
    method = models.CharField(max_length=20, null=True)
    view_time = models.DateTimeField()

这是我的查询。

 Pageview.objects.values('visitor__user__first_name', 'visitor__user__last_name', 'visitor__user').annotate(url_count=Count('url')).annotate(url_count_unique=Count('url', distinct=True))

我在这里获取用户访问过的网址数量,以及访问过的唯一网址数量。 在这里,我还想知道哪个网址用户访问过最多?

修改

我的查询的翻译。

Goto PageViews and count the occurring of unique URLS.(how many times a url have occurred.) and give me the one that have most visited count against each user. 

我希望问题很清楚,如果不让我知道的话。

2 个答案:

答案 0 :(得分:1)

恕我直言,你与many-to-many的关系会更好。你会有类似的东西:

class VisitedURLs(models.Model):
    page = models.ForeignKey(Visitor, ....)
    user = models.ForeignKey(User, ....)
    timestamp = models.DateTimeField(auto_now_add=True)

原始模型就像:

class Visitor(models.Model):
    members = models.ManyToManyField(PageView, through='VisitedURLs')

class PageView(models.Model):
    url = models.CharField(max_length=500)
    method = models.CharField(max_length=20, null=True)

在这种情况下,您可以使用visitedURLs模型上的count / distinct,当您获得该类型的对象时,您将拥有一个FK到Visitor对象(这将为您提供用户) ...)和URL的FK。

另一种方法是明确计算每个唯一的访客/网址组合并将其存储在某个地方。根据使用情况(例如,如果您想经常计算/显示),使用专用存储可能会更好。

答案 1 :(得分:0)

这是我提出的解决方案。

Pageview.objects.filter(visitor__user_id=user['visitor__user_id']).values(
                'url').annotate(page_count=Count('id')).order_by('-page_count')
 if max_visited_node:
                user['max_visited_node'] = max_visited_node[0]
通过这种方式,我可以获得用户访问过的所有页面的计数。然后我按照那个数量对它们进行排序,然后我得到包含URLpage_count的顶部第一个元素。

这就是我想要的。 Laur lvan的建议值得相当多。