我正在使用django-hitcount來達到我的數據庫對象。我想通過對象計算命中數來確定哪個對象在給定時間範圍內命中最多。該應用程序有興趣在這裏兩種型號:在Django中用一般關係註釋
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' 到現場。選擇是:創建,hitcount,id,ip,會話,用戶,user_agent
經過一番挖掘,我發現annotation and generic relations do not work well together。如果我使用object_pk而不是content_object,它可以正常工作,但是我沒有該對象的名稱。
所以我的問題:什麼是取得同樣結果的替代方法?如何可以按對象分組,但也保留名稱?
我確實有model(content_type)和id(object_pk),所以我總是可以單獨拉這些,但看起來不夠雅緻。 。 。
現在沒有可能嘗試這種方式,但是您是否嘗試過'limited_hc = Hit.objects.all()。values('hitcount__content_type','hitcount__object_pk')。annotate(count = Count('hitcount__object_pk'))'? – 2010-11-19 11:57:32
這有效,但我沒有得到實際對象的鏈接。所以我不能得到名字,只有PK。然後,我必須再次ping數據庫以從相應表中提取名稱數據。 – 2010-11-19 16:41:12