Мне кажется, что запрос, который я пытаюсь выполнить, не слишком сложен, но после попыток и попыток я чувствую себя немного растерянным.
Я работаю с тремя моделями в своем приложении для викторин:
Пользователь - у которого есть атрибут 'викторины', который является отношением к таблице 'викторины'
Викторина - у которого есть атрибут 'вопросы', который является отношением к таблице 'вопросов'.
Вопрос - имеет атрибут «правильный», который является логическим.
Для моего запроса я хотел бы вернуть общее количество вопросов, на которые данный пользователь ответил правильно.Я не очень хорошо разбираюсь в SQLAlchemy, и меня смущает цепочка отношений моделей.
Вот мой код моделей:
class Question(db.Model):
""" Question object that will be a part of a Quiz's question_list
Attributes:
key - word/item to be tested from subject dictionary
answer - correct answer generated via Quiz.type_method
definition - word definition from subject dict
question - question_string created by quiz.Quiz
"""
__tablename__ = 'questions'
question_id = db.Column('id', db.Integer, primary_key=True)
key = db.Column(db.String)
answer = db.Column(db.String)
definition = db.Column(db.String)
question = db.Column(db.String)
correct = db.Column(db.Boolean)
quiz_id = db.Column(db.Integer, db.ForeignKey('quizzes.id'))
quiz = db.relationship('Quiz', back_populates='questions')
def __repr__(self):
return (f"<Question(key='{self.key}', answer='{self.answer}', "
f"definition='{self.definition}', question='{self.question}', "
f"correct={self.correct}, quiz_id={self.quiz_id})>")
class Quiz(db.Model):
__tablename__ = 'quizzes'
quiz_id = db.Column('id', db.Integer, primary_key=True)
category = db.Column(db.String, nullable=False)
quiz_type = db.Column('type', db.String, nullable=False)
taken_on = db.Column(db.String,
default=datetime.utcnow().isoformat(' ', 'seconds'))
user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
questions = db.relationship('Question', order_by=Question.question_id,
back_populates='quiz')
user = db.relationship('User', back_populates='quizzes')
@property
def num_correct(self):
return len([q for q in self.questions if q.correct])
@property
def num_wrong(self):
return len(self.questions) - self.num_correct
@property
def questions_asked(self):
return self.num_correct + self.num_wrong
@property
def questions_remaining(self):
return self.length - (self.num_correct + self.num_wrong)
@property
def score_percent(self):
return round(self.num_correct / self.questions_asked, 2)
def results(self):
""" Return formatted string summary of quiz results """
return 'You got {} question{} correct and {} question{} wrong.'.format(
self.num_correct, '' if self.num_correct == 1 else 's',
self.num_wrong, '' if self.num_wrong == 1 else 's')
# can use string formatting for title case
def __str__(self):
""" Return quiz_string for printing based on quiz_specs """
if self.quiz_type == 'definition':
return f'{self.category} {self.quiz_type} quiz'
else:
return f'{self.quiz_type} tense {self.category} quiz'
def __repr__(self):
return (f"<Quiz(category='{self.category}', "
f"quiz_type='{self.quiz_type}', quiz_id={self.quiz_id}, "
f"taken_on={self.taken_on})>")
# TODO: add admin column
class User(db.Model, UserMixin):
__tablename__ = 'users'
id = db.Column('id', db.Integer, primary_key=True)
username = db.Column(db.String, unique=True, nullable=False)
email = db.Column(db.String(120), index=True, unique=True)
password_hash = db.Column(db.String(128))
# db.String because sqlite has no DateTime type isoformat='YYYY-MM-DD'
created_on = db.Column(db.String,
default=datetime.utcnow().isoformat(' ', 'seconds'))
# num_correct , num_wrong
quizzes = db.relationship('Quiz', order_by=Quiz.quiz_id,
back_populates='user')
Вот ссылка на github, если она обеспечиваетлучший контекст:
полный код
Я действительно застрял здесь.Даже точка в правильном направлении будет очень цениться.