Цель состоит в том, чтобы выяснить, нет ли в ответе на опрос текущих ответов на все вопросы верхнего уровня.
Это можно сделать, получив все вопросы верхнего уровня для ответа, а затем отфильтровав вопросы, на которые нет текущих ответов.
Я могу написать это на SQL, но есть ли способ реализовать это с помощью интерфейса QuerySet django?
Модели
class Survey(Model):
...
class SurveySection(Model):
survey = ForeignKey(Survey, related_name='survey_sections')
class SurveyQuestion(Model):
survey_section = ForeignKey(SurveySection, related_name='survey_questions')
parent = ForeignKey('self') #questions can be nested
class SurveyResponse(Model):
survey = ForeignKey(Survey, related_name='survey_responses')
class SurveyAnswer(Model):
survey_response = ForeignKey(SurveyResponse, related_name='survey_answers')
survey_question = ForeignKey(SurveyQuestion, related_name='survey_answer')
is_current = BooleanField()
SQL
Это должно найти все вопросы верхнего уровня для опроса, для которого предназначен ответ, получить текущие ответы, соответствующие этим вопросам, и удалить вопросы, на которые нет ответов.
select * from survey_surveyquestion question
join survey_surveysection section on section.id = question.survey_section_id
join survey_survey survey on survey.id = section.survey_id
join survey_surveyresponse response on response.survey_id = survey.id
left outer join survey_surveyanswer answer on answer.survey_question_id = question.id and answer.is_current = true
where response.id = 16
and answer.id is null
and question.parent is null
@ruddra Нет необходимости определять, правильный ответ или неправильный. Нам важно только, чтобы ответ был «текущий» (is_current=True) для набора вопросов, которые мы ищем.
извините, @ruddra, в коде отсутствовало поле is_current
- я только что отредактировал вопрос и добавил его.
Вы можете использовать этот подход:
Во-первых, получите количество вопросов, у которых родительский нуль:
top_question_count = SurveyQuestion.objects.filter(parent__is_null=True).count()
Затем используйте его в фильтре:
from django.db.models imprt Count
SurveyResponse.objects.filter(
survey_answers__survey_question__parent__is_null=True,
is_current=True
).annotate(
top_level_questions=Count('survey_answers__survey_question')
).filter(
top_level_questions=top_question_count
)
Если я правильно понимаю, top_question_count
должен фильтровать по родителю (сейчас он считает все вопросы)? Кроме того, SurveyResponse должен вместо этого фильтровать is_current в SurveyAnswer? Но я понимаю, как это работает, и это действительно отвечает на вопрос. Побочный вопрос: если можно было получить несколько ответов на вопрос, есть ли способ получить уникальный идентификатор вопроса для ответов на опрос?
@richflow упс. Это должно быть, если родитель имеет значение null. Обновлен мой ответ
Мне непонятно, как определить, правильный ответ на опрос или нет?