Django оставил фильтр внешнего соединения, не совпадающие записи

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

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

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

@ruddra Нет необходимости определять, правильный ответ или неправильный. Нам важно только, чтобы ответ был «текущий» (is_current=True) для набора вопросов, которые мы ищем.

richflow 20.06.2019 06:30

извините, @ruddra, в коде отсутствовало поле is_current - я только что отредактировал вопрос и добавил его.

richflow 20.06.2019 07:03
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
35
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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 20.06.2019 08:36

@richflow упс. Это должно быть, если родитель имеет значение null. Обновлен мой ответ

ruddra 20.06.2019 09:44

Другие вопросы по теме