Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
django如何在不进行太多查询的情况下检查此应用程序上是否已存在用户?_Django_Django Queryset - Fatal编程技术网

django如何在不进行太多查询的情况下检查此应用程序上是否已存在用户?

django如何在不进行太多查询的情况下检查此应用程序上是否已存在用户?,django,django-queryset,Django,Django Queryset,假设这些为django模型: class Question(): question = charfield() choice = charfield(choices = answer_choice) class Answer(): question = models.foreignkey(Question, related_name = 'answers') answerer = models.foreignkey('auth.User') answ

假设这些为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个问题,每个
用户可以回答,但不能更改每个问题的答案。对于每个问题,我必须检查
回答者
上是否已经存在
用户
。然后我制作模板标签: @寄存器过滤器 定义此用户存在(用户,obj): obj=obj.answers.filter(answerer\u id=user.id) 返回obj

然后在模板上:

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

问题是,对于每个问题,它会生成一个查询,所以对于100个问题,它会生成100个查询。我尝试此查询以生成问题
question.objects.all()
question.objects.prefetch\u related('answers')
,但仍然遇到问题。有没有更好的方法在不进行太多查询的情况下实现这一点?

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

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
查询数量已减少,您可以检查这是否有帮助。

在您的视图中:

answered_ids = [ans.question_id for ans in Answer.objects.filter(answerer=request.user)]
在模板中:

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