django多对多查询不给用户

Posted

技术标签:

【中文标题】django多对多查询不给用户【英文标题】:django many to many query not giving user 【发布时间】:2014-12-17 07:26:56 【问题描述】:

我有模型:

class Question(models.Model):
    user = models.ForeignKey(User)
    title = models.CharField(max_length=120)
    description = models.TextField()
    category = models.ForeignKey('Category')
    answers = models.ManyToManyField('Answer',related_name='answer_name', blank=True)
    post_date = models.DateTimeField(auto_now=True)
    published = models.BooleanField(default=False)                     

    def __unicode__(self):
        return self.title

class Answer(models.Model):
    user = models.ForeignKey(User)
    question = models.ForeignKey(Question)
    ans_body = models.TextField()
    comments = models.ManyToManyField('Comment',related_name='answer_name', blank=True)
    count = models.IntegerField()
    post_date = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        return self.ans_body

我对提交答案的看法是:

ques = Question.objects.get(id=pk)
cpk = ques.category.id
anstext = request.GET.get('ans_body',False)

if request.user.is_doctor:
    for ansr in ques.answer_set.all():
        some = ansr.user.username
        print some
         if not request.user.username in some:
            ans = Answer()
            ans.user = request.user
            ans.question = ques
            ans.ans_body = anstext
            ans.save()
            messages.success(request, "Your answer has been posted successfully.")
            return redirect("question-detail", pk, cpk)
        else:
            messages.warning(request, "You cannot answer twice. Please use comment.")
            return redirect("question-detail", pk, cpk)
else:
    messages.warning(request, "You are not allowed to answer")
    return redirect("question-detail", pk, cpk)

我在提交完美的答案时没有任何问题。这里我只想要所有给出答案的用户。

当我打印“一些”时,它只给第一个提交答案的用户,但我想要所有用户。

如何获取所有用户?多对多查询将是什么。我做错了什么??

当我执行for ansr in ques.answer_set.all(): 时,它说视图没有返回 HttpResponseObject,而是没有返回... 有什么解决办法吗??

【问题讨论】:

您确定问题ques 有多个答案吗?当您在答案模型中已经有 Question ForeignKey 时,为什么还要使用 ManyToManyField 您不应该使用ques.answers.all() 而不是ques.answer_set.all() 吗? user.is_doctor 是方法还是属性? goo.gl/wpsq7s ... 关注@AamirAdnan 的评论 【参考方案1】:

您的方法在处理用户多个答案的用例方面确实很糟糕,这样的事情应该适合您:

ques = Question.objects.get(id=pk)
anstext = request.GET.get('ans_body',False)

if request.user.is_doctor:
    if ques.answer_set.filter(user__id=request.user.id).exists():
        messages.warning(request, "You cannot answer twice. Please use comment.")
    else:
        ans = Answer.objects.create(user=request.user, question=ques, ans_body=anstext)
        messages.success(request, "Your answer has been posted successfully.")
else:
    messages.warning(request, "You are not allowed to answer")
return redirect("question-detail", pk, ques.category.id)

虽然这仍然是一个不好的方法,但你应该使用forms

【讨论】:

哦,当我执行 ques.answer_set.all() 并打印已回答问题的用户时,它只打印一个用户。 这是因为在您的代码中,forloop 在第一次迭代中返回HttpResponse。它永远没有机会进行第二次迭代。如果一个问题没有答案,那么您将收到错误view didn't return HttpResponseObject it returned none instead,因为您没有处理这种情况。无论如何,您的代码都是混乱和错误的,请尝试我的解决方案。

以上是关于django多对多查询不给用户的主要内容,如果未能解决你的问题,请参考以下文章

查询 django 多对多

过滤后更新 Django 的多对多

django - 如何查询仅描述的对象存在于多对多字段中的位置

逻辑或 Django 多对多查询返回重复结果

Django如何过滤多对多字段中的对象,而不是原始查询集

django-blog:多对多查询