2013-07-17 4 views
0

У меня есть приложение, которое экономит универсиады викторин с использованием двух моделей: StudentQuiz сохраняющим вопросами студент был задан вопросом StudentQuestion сохраняет ответы студента по каждому из этих вопросов.Как создать запрос на основе полей другого QuerySet

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.

Так я создаю первый QuerySet:

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

Теперь я хочу посмотреть на все вопросы, которые находятся в этих StudentQuizzes, и вы хотите посчитать количество вопросов, которые имеют q_score = 1.

В настоящее время я просто перебираю QuerySet и делаю это программно. Но QuerySet может быть огромным.

Есть ли способ сделать это, используя DB API-интерфейсы django?

ответ

2

взглянуть на документы на queries that span relationships

в основном, вы должны просто быть в состоянии ссылаться на student_quiz, связанный с StudentQuestion объекта в запросе на StudentQestion, фильтрация по q_score и пользователя, а затем использовать __ доступа (filter(student_quiz__date_gte=blah)

+0

Я пробовал ваше предложение, но не понимаю его. У меня есть QuerySet StudentQuizzes. Каждый StudentQuiz имеет 5 FKs для StudentQuestion. Пока StudentQuestion не имеет FK для StudentQuiz. Поэтому я не могу фильтровать на StudentQuestion и искать student_quiz__date_gte = blah - правильно? – zaphod

+0

вы на самом деле можете! Из документов «Это работает и наоборот». Чтобы обратиться к «обратным» отношениям, просто используйте строчное имя модели ». Если вы посмотрите на свой пример, это похоже на вашу настройку. Блог для входа - это отношение «один ко многим», где «Записи» имеют внешние ключи для блогов. https://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships - еще один хороший раздел на этой странице (хотя, если бы я был вами, я мог бы читать с самого начала) – Colleen

+0

I прочитал обратную связь. Я не получаю все записи. Я предполагаю, что часть, где я, вероятно, ошибаюсь, состоит в том, что в одной модели есть 5 FK. Так что, вероятно, просто использование имени модели недостаточно? – zaphod

Смежные вопросы