我正在使用django-hitcount来统计对我的数据库对象的命中。我想按对象计算点击次数,以确定在给定时间范围内哪个对象的点击次数最多。该应用程序在这里有两个感兴趣的模型:
class Hit(models.Model):
created = models.DateTimeField(editable=False)
ip = models.CharField(max_length=40, editable=False)
session = models.CharField(max_length=40, editable=False)
user_agent = models.CharField(max_length=255, editable=False)
user = models.ForeignKey(User,null=True, editable=False)
hitcount = models.ForeignKey(HitCount, editable=False)
class HitCount(models.Model):
hits = models.PositiveIntegerField(default=0)
modified = models.DateTimeField(default=datetime.datetime.utcnow)
content_type = models.ForeignKey(ContentType,
verbose_name="content cype",
related_name="content_type_set_for_%(class)s",)
object_pk = models.TextField('object ID')
content_object = generic.GenericForeignKey('content_type', 'object_pk')
“命中”记录每个命中的时间戳,而 HitCount 存储命中的总数。要在某个时间范围内按对象获取命中,我需要执行以下操作:
按创建日期过滤命中计数每个 content_object 的命中数(在上面过滤的时间范围内)按上面计算的计数排序返回 content_object 和计数
这可能非常昂贵,所以我计划每天计算/缓存一次。
作为第一步,我想计算每个 content_object 的点击次数,而不考虑时间范围。
limited_hc = Hit.objects.all().values('hitcount__content_object').annotate(count = Count('hitcount__object_pk'))
我立即遇到了一个问题:
无法将关键字“hitcount__content_object”解析为字段。选项有:created、hitcount、id、ip、session、user、user_agent
经过一番挖掘,我发现注释和泛型关系不能很好地协同工作。如果我使用 object_pk 而不是 content_object,它可以正常工作,但是我没有对象的名称。
所以我的问题是:实现相同结果的替代方法是什么?如何按对象分组但还保留名称?
我确实有模型 (content_type) 和 id (object_pk),所以我总是可以单独提取它们,但这似乎不优雅。. .