Не могу понять более глубокий запрос с помощью фляги-sqlalchemy - PullRequest
0 голосов
/ 07 февраля 2019

Мне кажется, что запрос, который я пытаюсь выполнить, не слишком сложен, но после попыток и попыток я чувствую себя немного растерянным.

Я работаю с тремя моделями в своем приложении для викторин:

Пользователь - у которого есть атрибут 'викторины', который является отношением к таблице 'викторины'

Викторина - у которого есть атрибут 'вопросы', который является отношением к таблице 'вопросов'.

Вопрос - имеет атрибут «правильный», который является логическим.

Для моего запроса я хотел бы вернуть общее количество вопросов, на которые данный пользователь ответил правильно.Я не очень хорошо разбираюсь в 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, если она обеспечиваетлучший контекст:

полный код

Я действительно застрял здесь.Даже точка в правильном направлении будет очень цениться.

...