質問はすでに複数回行われていますが、コードを機能させることができませんでした。とにかく、ブログ投稿のあるブログを持っているとしましょう:
class BlogPost(models.Model): # This class doesn't really matter
author = models.ForeignKey(myUser)
text = models.TextField()
別のモデルを使用して、各ブログ投稿の訪問を記録することがあります。
class Activity(models.Model):
user_id = models.CharField()
# I log different types of activities, hence the choice
action_id = models.IntegerField(choices=ACTIVITY_ACTIONS)
object_id = models.CharField()
created_at = models.DateTimeField()
私が望むのは、正確な日付以降に最も訪問されたブログ投稿を、閲覧数順に並べることです。私が今していること(アクティビティマネージャーで):
def get_blogposts_most_viewed_since(self, date):
# I get all related activities (blog posts views since date)
activities = Activity.objects.since(date).filter(action_id=BLOGPOST_VIEW)
# I get all blogposts' ids
blogpost_ids = events.values('object_id')
# I get all blogposts ordered by their number of views:
blogposts = BlogPost.objects.filter(id__in=blogpost_ids)\
.annotate(nb_views=Count('id')).order_by('-nb_views')
return blogposts
これはうまくいきません。いくつかのテストを行いました: 3 つのブログ投稿を作成し、blogpost_a は 2 回表示され、blogpost_b は 1 回表示され、blogpost_c は表示されません。を呼び出すと、get_blogposts_most_viewed_since
blogpost_a と blogpost_b が取得されますが、random_order のように見えます。
私はいくつかのデバッグをしようとしました:
for blogpost in blogposts:
print blogpost.nb_views
両方のブログ投稿 (a と b) にはnb_views == 1
.
私は何を間違っていますか?