В настоящее время у меня есть несколько таблиц с четкими взаимосвязями.Однако я хочу, чтобы одна таблица (Приложение), которая имеет отношение к таблице Ответов и таблице Вопросов, показывала только те ответы, которые имеют Вопросы, помеченные как активные.Я пытаюсь сделать это через модель приложения, чтобы в «Зефире» он мог вернуться внутрь приложения.Я также пытаюсь сделать это, не производя запрос N + 1.
Таблицы
application_question_table = db.Table(
'application_questions',
db.Column(
'application_id',
db.Integer,
db.ForeignKey(
'application.id',
name="application_questions_application_id_fkey",
ondelete="CASCADE"
)
),
db.Column(
'question_id',
db.Integer,
db.ForeignKey(
'question.id',
name="application_questions_question_id_fkey",
ondelete="CASCADE"
)
)
)
class Application(Base):
id = db.Column(db.Integer, primary_key=True)
answers = db.relationship('Answer', back_populates="application", cascade=‘delete)
active_answers = db.relationship("should only show answerswhere question is active")
questions = db.relationship('Question', lazy="dynamic", secondary=application_question_table)
class Answer(Base):
id = db.Column(db.Integer, primary_key=True)
question_id = db.Column(db.Integer, db.ForeignKey('question.id', ondelete="SET NULL", name="answer_question_id_fkey"))
question = db.relationship('Question', back_populates=“answers")
class Question(Base):
id = db.Column(db.Integer, primary_key=True)
answers = db.relationship("Answer", back_populates="question")
applications = db.relationship('Application',lazy="dynamic", secondary=application_question_table)
active = db.Column(db.Boolean, default=True)
Схема - Обратите внимание, что получение видимых вопросов - это, по сути, то, чего я хочу.Но мне не нравится делать это таким образом, потому что это будет дополнительный запрос для каждого приложения, которое я найду.
class ApplicationSchema(ModelSchema):
visible_answers = fields.Method('get_visible_answers')
class Meta:
model = Application
def get_visible_answers(self, application):
schema = ApplicationAnswerSchema(many=True)
answers = Answer.query.join(
Answer.application,
Answer.question
).filter(
Application.id == application.id,
Question.active == True,
).all()
return schema.dump(answers).data
class ApplicationAnswerSchema(ModelSchema):
class Meta:
model = Answer
Мое ожидаемое поведение - когда я делаю что-то вроде
applications = Application.query.options(joinedload(Application.active_answers)).all()
schema = ApplicationSchema(many=True)
results = schema.dump(applications)
Что будет только один запрос, и я могу ввести каждое приложение и получить видимые ответы.
Фактический результат, который я получаю, заключается в том, что я получаю дополнительный запрос для каждого приложения.