django-hitcountを使用して、データベースオブジェクトへのヒットを集計しています。オブジェクトごとのヒット数をカウントして、特定の時間範囲でヒット数が最も多いオブジェクトを特定したいと思います。アプリには、ここで関心のある2つのモデルがあります。
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とカウントを返します
これは非常に高額になる可能性があるため、1日1回の計算/キャッシュを計画しました。
最初のステップとして、時間範囲に関係なく、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です。
少し掘り下げてみると、アノテーションと一般的な関係がうまく連携していないことがわかりました。content_objectの代わりにobject_pkを使用すると、正常に機能しますが、オブジェクトの名前がわかりません。
だから私の質問:同じ結果を達成するための代替手段は何ですか?オブジェクトごとにグループ化するだけでなく、名前を保持するにはどうすればよいですか?
私はモデル(content_type)とid(object_pk)を持っているので、これらをいつでも別々にプルできますが、それはエレガントではないようです。。。