如何在Django中重新创建此SQL?

时间:2012-05-31 18:02:53

标签: django django-models django-queryset

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

我有三个模型:QuestionAnswerAnswerVote。每个问题都有一套答案,每个答案都有一套AnswerVotes。 AnswerVote有一个字段helpful,它是一个布尔值。

我想要做的是通过为每个答案计算score得到所有有用的问题答案(+1表示有用= True,-1表示有用= False)。如果答案分数> gt,则答案很有用。 0

任何帮助将不胜感激!

2 个答案:

答案 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。