【问题标题】:Listing answers for question(get_object_or_404) in for loop. How can I get each answer also as an object in one def?在 for 循环中列出问题(get_object_or_404)的答案。如何将每个答案也作为一个对象中的一个对象?
【发布时间】:2020-05-06 19:31:09
【问题描述】:

如果我的标题对您没有多大意义,我很抱歉。我有一个问题,我在描述它时遇到了问题。如果您能帮助我,我将不胜感激。

我的问题对象有一个小型投票系统。我的问题有很多答案,我在 for 循环的“question_details”中列出。我当然可以访问问题模型,从而获得有关问题投票的信息,但我无法对每个答案都做同样的事情。也许一些代码可以更好地说明:

views.py:

def questiondetails(request, question_pk):
    question = get_object_or_404(Question, pk=question_pk)
    question_form_id = question
    total_voteup = question.total_voteup()
    total_votedown = question.total_votedown()
    is_voteup = False
    is_votedown = False
       if question.voteup.filter(id=request.user.id).exists():
           is_voteup = True
       if question.votedown.filter(id=request.user.id).exists():
           is_votedown = True

我可以检查投票情况,我可以检查用户是否投票赞成或反对。

在 questiondetails 的模板中,我正在做类似的事情:

{% for answer in question.answer_set.all %}
    {{ answer }}<br>
    <div id="answer_voting_section">
    {% include 'main/partials/answer_voting_section.html' %}
    </div>
{% endfor %}

然后。我可以点击我的问题,它会触发“questiondetails”并将我带到它的页面,其中包含来自这个 for 循环的问题和答案。

我的问题是,我想为来自该 for 循环的每个答案访问“total_voteup”(和其他内容)。

我该怎么做?我是 django 的 python 新手,所以我只知道我能够通过问题和问题详细信息来做到这一点,因为我正在传递一个“question_pk”。我可以在同一个 DEF 中访问与此问题相关的答案吗?或者这是不可能的,因为这些数据对于 django “尚不可见”?

@编辑:

我的模型:

class Question(models.Model):
    question = models.CharField(max_length=300)
    answered = models.BooleanField(default=False)
    created = models.DateTimeField(auto_now_add=True)
    datecompleted = models.DateTimeField(null=True, blank=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    voteup = models.ManyToManyField(User, related_name='voteup', blank=True)
    votedown = models.ManyToManyField(User, related_name='votedown', blank=True)

    def __str__(self):
        return self.question

    def total_voteup(self):
        return self.voteup.count()

    def total_votedown(self):
        return self.votedown.count()


class Answer(models.Model):
    question_id = models.ForeignKey(Question, on_delete=models.CASCADE, blank=False, null=True)
    answer = models.TextField(max_length=1000)
    created = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    answer_voteup = models.ManyToManyField(User, related_name='answer_voteup', blank=True)
    answer_votedown = models.ManyToManyField(User, related_name='answer_votedown', blank=True)

    def __str__(self):
        return self.answer

    def total_answer_voteup(self):
        return self.answer_voteup.count()

    def total_answer_votedown(self):
        return self.answer_votedown.count()

【问题讨论】:

  • 你能分享你的模型吗?一个人可以对一个问题或一个答案投票吗?
  • 我添加了我的模型 ID 编辑。每个用户都可以对所有内容、问题和每个答案进行投票。一个问题可以有很多答案。每次投票都可以是 UP 或 DOWN,如果用户已经投了 UP,他可以通过再点击一次来恢复它。
  • 你想计算来自特定用户的总答案吗,我真的不知道你的问题。或对单个问题的总答案。?
    如果对于特定问题,您可以使用对象集_set,或者对于用户,您可以编辑实例。
  • 好吧,我明白了,我明白了,我想我可以帮助你,给我几分钟。但是答案总票数必须与特定问题相关??
  • 当然,非常感谢您抽出宝贵时间。我会等的。

标签: python django django-models django-templates


【解决方案1】:

虽然您的代码有很多冗余并且您的答案模型不需要使用 question_id 字段 django 会为您创建 id,但答案字段应该具有 models.OneToMany 关系。 但是您可以将答案模型导入视图并执行与您在同一视图内对问题进行投票和否决的类似操作,即 answer_upvote = Answer.objects.filter(question_id=question).total_answer_voteup() answer_downvote = Answer.objects.filter(question_id=question).total_answer_votedown()

我尝试使用的逻辑是获取与每个问题相关的所有对象

但这样你就可以解决问题。

【讨论】:

  • 感谢您的回答。但是我遇到了问题。我得到“'QuerySet' 对象没有属性 'total_answer_voteup'”。我将答案模型导入到我的views.py 中。我写了 - “total_answer_voteup = Answer.objects.filter(answer=question).total_answer_voteup()” 它给了我这个查询错误。是不是因为这个问题查询没有这个答案属性?
  • 您创建的方法似乎无法评估为什么不直接查询字段。
    answer_upvote = Answer.objects.filter(question_id=question).values('answer_vote_up').count() answer_downvote = Answer.objects.filter(question_id=question).values('answer_vote_down').count()。
    注意:你也可以用 values_list() 替换 values() 来查询多个字段。希望现在可以解决。
  • 非常感谢您的时间和帮助。我重建了与投票答案相关的大部分代码,但我仍然使用了你的建议。谢谢你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 2012-12-23
  • 1970-01-01
相关资源
最近更新 更多