我有一个模型基本上我跟踪用户的活动。我想知道用户访问的页面是什么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.
我希望问题很清楚,如果不让我知道的话。
答案 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]
通过这种方式,我可以获得用户访问过的所有页面的计数。然后我按照那个数量对它们进行排序,然后我得到包含URL
和page_count
的顶部第一个元素。
这就是我想要的。 Laur lvan
的建议值得相当多。