django оставил фильтр внешнего поиска несоответствующих записей - PullRequest
0 голосов
/ 20 июня 2019

Цель состоит в том, чтобы выяснить, нет ли в ответе на опрос текущих ответов на все вопросы высшего уровня.

Это можно сделать, получив все вопросы верхнего уровня для ответа, а затем отфильтровав вопросы, на которые нет текущих ответов.

Я могу написать это на 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

1 Ответ

1 голос
/ 20 июня 2019

Вы можете использовать этот подход:

Во-первых, получите количество вопросов с родительским нулем:

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
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...