0

これらをdjangoモデルと想定します。

class Question():

    question = charfield()
    choice = charfield(choices = answer_choice)

class Answer():

    question = models.foreignkey(Question, related_name = 'answers')
    answerer = models.foreignkey('auth.User')
    answer = models.charfield()

100個の質問を表示し、それぞれUserが回答できるページを作成していますが、各質問の回答を変更することはできません。質問ごとに、にがUserすでに存在するかどうかを確認する必要がありAnswererます。次に、テンプレートタグを作成します。@ register.filter def this_user_exists(user、obj):obj = obj.answers.filter(answerer_id = user.id)return obj

次に、テンプレートで:

# obj is list of question
{% if not user|this_user_exists:obj %}
    # can answer
{% else %}
    # cannot answer
{% endif %}

問題は、すべての質問に対して1つのクエリを生成するため、100の質問に対して100のクエリを生成することです。このクエリを試して質問を生成しQuestion.objects.all() ましQuestion.objects.prefetch_related('answers')たが、それでも問題が発生しました。あまり多くのクエリを行わずにこれを達成するためのより良い方法はありますか?

4

2 に答える 2

2

クエリを減らすには、最初に必要な回答をクエリしてから、関連するすべての回答者を取得します。

answers = Answer.objects.select_related('answerer').filter(xxxx)

# fetch related user id's
userids_in_answer = [answer.answerer.id for answer in answers]

# fetch user ids
user_id_set = set(User.objects.filter(id__in=userids_in_answer).values('id', flat=True)

その後、ユーザーが存在するかどうかを簡単に知ることができます。

for answer in answers:
  if answer.answerer.id in user_id_set:
      xxx

クエリ数が減り、これが役立つかどうかを確認できます。

于 2012-12-27T01:06:46.227 に答える
0

あなたの見解では:

answered_ids = [ans.question_id for ans in Answer.objects.filter(answerer=request.user)]

テンプレート内:

{% if not obj.id in answered_ids %}
    # can answer
{% else %}
    # cannot answer
{% endif %}
于 2012-12-27T01:06:52.743 に答える