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多对多查询不给用户的主要内容,如果未能解决你的问题,请参考以下文章