2013-07-17 36 views
0

领域创建一个查询我有使用两种模式可以节省学生测验的应用程序: StudentQuiz保存学生被要求 StudentQuestion节省了学生的每一个这些问题的反应的问题。如何基于另一个查询集

class StudentQuestion(models.Model): 
    user = models.ForeignKey(User) 
    question = models.ForeignKey('Question') # comes from a Questions table 
    answer = models.CharField("Answer", max_length = 100, blank=True, null=True) 
    q_score = models.IntegerField("Score", blank=True, null=True) 


class StudentQuiz(models.Model): 
    user = models.ForeignKey(User) 
    date = models.DateField("Quiz Date", blank=True, null=True) 
    total_score = models.IntegerField("Score", blank=True, null=True) 
    ques1 = models.ForeignKey(StudentQuestion, related_name='q1') 
    ques2 = models.ForeignKey(StudentQuestion, related_name='q2') 
    ques3 = models.ForeignKey(StudentQuestion, related_name='q3') 
    ques4 = models.ForeignKey(StudentQuestion, related_name='q4') 
    ques5 = models.ForeignKey(StudentQuestion, related_name='q5') 

我想找到问题的学生参加了为他获得了得分的,比如某个日期范围内的数量,1

所以我创建第一个查询集:

quizzes_done = StudentQuiz(user=mystudent, date__gte=start_date, date__lte=end_date) 

现在,我想看看是在这些StudentQuizzes,并要计算有q_score = 1问题数的所有问题。

目前,我只是遍历的查询集和编程这样做。但是QuerySet可能很大。

有没有办法做到这一点使用Django的数据库API的?

回答

2

看看该文档上queries that span relationships

基本上,你应该能够引用您的StudentQuestion对象上StudentQestion查询相关的student_quiz,上q_score和用户过滤,然后用__访问你想要的StudentQuiz属性(例如filter(student_quiz__date_gte=blah

+0

我一直在尝试你的建议,但还没有得到它。我有一个StudentQuizzes的QuerySet。每个StudentQuiz有5个FK到StudentQuestion。 StudentQuestion没有FK给StudentQuiz。所以我无法过滤StudentQuestion并查找student_quiz__date_gte = blah - 对吗? – zaphod

+0

你其实可以!从文档“这倒过来了。要引用‘反向’的关系,只是使用模型的小写名字。”如果你看看你的例子,它与你的设置很相似 - Blog to Entry是一对多的关系,其中条目具有博客的外键。 https://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships是该页面上的另一个很好的部分(尽管如果我是你,我可能会从头开始阅读) – Colleen

+0

I确实读到了相反的关系。我没有得到所有的条目。我想我可能出错的部分是同一个模型中有5个FK。所以可能只是使用型号名称是不够的? – zaphod

相关问题