0

私は次のモデルを持っています

class Article(models.Model):
    title = models.CharField(max_length=255, db_index=True)
    slug = UniqueSlugField(prepopulate_from='title', unique=True)
    favorited = models.ManyToManyField(to=User, blank=True)
    tags = TaggableManager()
    ...

class Vote(models.Model):
    article = models.ForeignKey(to=Article)
    voter = models.ForeignKey(to=User, related_name='voter')
    timestamp = models.DateTimeField(auto_now_add=True)
    ...

次のコード行を使用して、選択したタグの人気記事を降順で取得します

Vote.objects.filter(tags__in=[tag]).annotate(num_articles=Count('article')).order_by('-num_articles')

Article.favorited次のフィールドとモデルに基づいて人気のある記事を取得する orm クエリを作成する方法はVote?

ありがとう、

スルタン

4

2 に答える 2

3

Voteモデルを通じて「人気のある記事」を入手するのはなぜですか。クエリを実行すると、Votesのクエリセットになります。Article次に、そこからsを取得するために、追加のクエリを発行する必要があります。

次のものを使用する必要があります。

Article.objects.filter(tags=tag).annotate(vote_count=Count('vote')).order_by('-vote_count')

次に、Articlesの適切なクエリセットがあり、準備ができています。

お気に入りが必要な場合は、次のuser代わりに使用するように上記を変更しvoteます。

Article.objects.filter(tags=tag).annotate(favorite_count=Count('user')).order_by('-favorite_count')
于 2012-05-17T15:20:01.863 に答える
0

結合を使用

Article.objects.filter(favorited__in=[...]).annotate(
        vc=models.Count('vote')).order_by('-vc')

または、通常は高速(結合が少ない)ですが、より複雑で制限されています(クエリセットではなくなりましたが、通常は大きな問題ではありません)サブクエリバージョン

qs = Article.objects.filter(favorited__in=[...])
top_votes = Vote.objects.filter(article__in=qs).values('article').annotate(
         vc=models.Count('pk')).values_list('article', 'vc').order_by('-vc')

# normally you may only want Top N
top_n_pks = tuple(pk for pk, vc in top_votes[:N])
tops = sorted(Article.objects.filter(pk__in=top_n_pks).order_by(),
         key=lambda x: top_n_pks.index(x.pk))
于 2012-05-17T15:23:59.773 に答える