1

私はこのような2つのモデルを持っています(簡略化):

class Post(models.Model):
    content = models.TextField('content')
    #...

class Vote(models.Model):
    user = ForeignKey(User)
    status = models.TextField(choices = some_choices, default = 'likes')
    post = models.ForeignKey(Post)
    #...

私がやりたいのは、この投稿に対する特定の(現在の)ユーザーの投票でフィルターを使用して(1つのクエリを使用して)投稿を選択することです(彼が投票しなくても大丈夫です)ので、すべての投稿を出力できますまた、ユーザーは、好きなもの、嫌いなもの、投票しなかったものを確認できます。

select_relatedfor Votemodelは、関連するオブジェクトをフィルタリングできないため、ここでは役に立ちません。したがって、余分なものを使用して何かを行う必要があると思いますが、どの引数を渡す必要があるかがわかりません。

だから私は推測します、それは次のようなものでなければなりません:

Post.objects.filter(content__contains="test").extra(tables="app_vote", where={'my_vote_status': 'something here perhaps?'})

このようなクエリを作成する方法を理解するのを手伝っていただけませんか。

UPD:Post.vote_by_me schackiは良い解決策を提供しました。唯一の問題は、テンプレートからさまざまなユーザーの投票にアクセスしたいということですPost.vote_by_this_userPost.vote_by_top_user

4

3 に答える 3

2

まあ、あなたが適切に答えを求めているなら、時々あなたは自分でそれらを探すべきです:)

これが私の問題を解決した方法です:

posts = Post.objects.filter(content__contains="test"
    ).extra(select={    
                    #extra selects vote status here for current user
                    "my_vote_status":"""SELECT status FROM blog_vote as vt
                                WHERE vt.user_id = %s
                                AND   vt.post_id = blog_posts.id
                             """ % (request.user.pk) #
    }, tables=['blog_vote'])

UPD:おそらくtables議論なしで機能するでしょう

于 2012-09-29T11:30:58.293 に答える
1

あなたが何を望んでいるのかを理解するのは非常に難しいですが、ここに別の試みがあります。まず、投稿を取得します。

posts = Post.objects.filter(whatever)

今、あなたは投稿に対するユーザーのグループによるすべての投票を望んでいます、正しいですか?

votes = Vote.objects.filter(post__in=posts, user__in=users)

これで、ユーザーIDなどに基づいて投票を投稿に関連付けるだけです。

votes_by_user_by_post = defaultdict(lambda: defaultdict(list))
for v in votes:
    votes_by_user_by_post[post.id][v.user_id].append(v)

for post in posts:
    post.votes_by_user = votes_by_user_by_post[post.id]

パフォーマンス面では、2つのクエリといくつかのスクリプトでこれを行うのは問題ありません。これらは複雑なクエリではなく、スクリプト部分は2つのforループにすぎません。

于 2012-09-24T11:57:53.280 に答える
1

要件を正しく理解している場合は、コンテキストに渡すために2つのオブジェクトが必要になります。このようにしてみてください。ここで、meとother_userは有効なユーザーオブジェクトである必要があります。

posts.vote_by_me=Post.objects.filter(content__contains="test",vote_set__status="something here perhaps?",vote_set__user=me)
posts.vote_by_other_user=Post.objects.filter(content__contains="test",vote_set__status="something here perhaps?",vote_set__user=other_user)
于 2012-09-24T14:36:55.327 に答える