【问题标题】:django how to check if a user is already exists on this app without making too much query?django 如何在不进行过多查询的情况下检查该应用程序上是否已经存在用户?
【发布时间】:2012-12-27 00:54:33
【问题描述】:

假设这些是 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) 返回对象

然后在模板上:

# 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'),仍然有问题。有没有更好的方法来实现这一点而无需进行太多查询?

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    为了减少查询,您可以先查询出您需要的答案,然后获取所有相关的回答者,

    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
    

    查询数量减少了,你可以检查一下是否有帮助。

    【讨论】:

      【解决方案2】:

      在你看来:

      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 %}
      

      【讨论】:

        猜你喜欢
        • 2015-06-17
        • 1970-01-01
        • 2015-09-18
        • 2012-09-28
        • 2015-05-05
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 2023-03-13
        相关资源
        最近更新 更多