SELECT `av`.`answer_id`, SUM(IF(`av`.`helpful`=1, 1, -1)) as `score`
FROM `questions_answervote` AS `av`
JOIN `questions_answer` AS `a`
ON `a`.`id`=`av`.`answer_id` AND `a`.`question_id`='775819'
GROUP BY `av`.`answer_id`
HAVING SUM(IF(`av`.`helpful`=1, 1, -1)) > 0
我有三个模型:Question
,Answer
和AnswerVote
。每个问题都有一套答案,每个答案都有一套AnswerVotes。 AnswerVote有一个字段helpful
,它是一个布尔值。
我想要做的是通过为每个答案计算score
得到所有有用的问题答案(+1表示有用= True,-1表示有用= False)。如果答案分数> gt,则答案很有用。 0
任何帮助将不胜感激!
答案 0 :(得分:2)
如果您有以下内容:
from django.db import models
class Question(models.Model):
data = models.CharField(max_length=30)
class Answer(models.Model):
question = models.ForeignKey(Question)
def __str__(self):
return str(self.__dict__)
class AnswerVotes(models.Model):
answer = models.ForeignKey(Answer)
helpful = models.SmallIntegerField(default=0)
def __str__(self):
return str(self.__dict__)
这可能看起来有点类似于解决方法,但为什么根本不能平均所有选票都有帮助。而不是-1到1范围,您将在介于数据库中的原始值介于0和1之间。在你的情况下,简单地将0.5作为中间点,你应该得到相同的行为。
Answer.objects.annotate(score = Avg('answervotes__helpful'))
{'score': None, 'id': 1, 'question_id': 1}
{'score': 1.0, 'id': 2, 'question_id': 1}
{'score': 0.5, 'id': 3, 'question_id': 1}
{'score': 0.3333333333333333, 'id': 4, 'question_id': 2}
{'score': 0.5, 'id': 5, 'question_id': 3}
{'score': 0.4, 'id': 6, 'question_id': 3}
Answer.objects.annotate(score = Avg('answervotes__helpful')).filter(score__gte=0.5)
{'score': 1.0, 'id': 2, 'question_id': 1}
{'score': 0.5, 'id': 3, 'question_id': 1}
{'score': 0.5, 'id': 5, 'question_id': 3}
答案 1 :(得分:1)
Django的ORM没有HAVING
,所以你必须放弃这个原始SQL。