Как связать пользовательскую модель с двумя разными моделями, чтобы к свойствам этих моделей можно было получить доступ через current_user - PullRequest
0 голосов
/ 08 октября 2019

Я создаю онлайн-приложение для викторины, в которое могут войти и учитель, и ученики. Учителя могут создавать тесты, а учащиеся могут запускать эти тесты. Как я могу прикрепить модель Teacher и Student к модели User, чтобы к таким свойствам, как Teacher_Name или Student_Class и т. Д., Можно было получить доступ через current_user ?

Это не проблема в отношении роли пользователя. Поскольку с помощью flask-security я могу сделать это довольно легко, но предоставление роли означает группирование пользователей по уровню доступа, а не их идентификацию. Я имею в виду, что если студент входит в систему, мне нужно знать, кто этот конкретный студент представлен текущим вошедшим пользователем. Только тогда я могу сохранить его / ее результат в его / ее записи.

Ниже приведены мои sqlalchemy модели ...

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(120), unique=True, nullable=False)
    password = db.Column(db.String(60), nullable=False)

class Student(db.Model):
    __tablename__ = 'student'
    id = db.Column(db.Integer, primary_key=True)
    cls = db.Column(db.String(4), nullable=False, default='V')
    sec = db.Column(db.String(1), nullable=False, default='A')
    roll = db.Column(db.Integer, nullable=False, default=1)
    name = db.Column(db.String(24), nullable=False)
    dob = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
    sex = db.Column(db.Enum(Gender), nullable=False, default=Gender.male)
    results = db.relationship('Result', backref='student', lazy=True)
    __table_args__ = (db.UniqueConstraint("cls", "roll", name="cls_roll"),)

class Teacher(db.Model):
    __tablename__ = 'teacher'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(24), nullable=False)
    subject = db.Column(db.String(4), nullable=False)

quiz_ques = db.Table('quiz_ques', db.Column('quiz_id', db.Integer, db.ForeignKey('quiz.id'), nullable=False),
                     db.Column('mcq_id', db.Integer, db.ForeignKey('mcq.id'), nullable=False),
                     db.PrimaryKeyConstraint('quiz_id', 'mcq_id'))


class Quiz(db.Model):
    __tablename__ = 'quiz'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(50), nullable=False, unique=True)
    subject = db.Column(db.String(4), nullable=False)
    marks = db.Column(db.Integer, nullable=False, default=1)
    time_limit = db.Column(db.Integer, nullable=False, default=20)
    questions = db.relationship('MCQ', secondary=quiz_ques, lazy='subquery', backref=db.backref('quizzes', lazy=True))
    results = db.relationship('Result', backref='quiz', lazy=True)

class MCQ(db.Model):
    __tablename__ = 'mcq'
    id = db.Column(db.Integer, primary_key=True)
    subject = db.Column(db.String(4), nullable=False)
    topic = db.Column(db.String(150), nullable=False)
    question = db.Column(db.String(255), nullable=False)
    answers = db.Column(db.Text(), nullable=False)

class Result(db.Model):
    __tablename__ = 'result'
    id = db.Column(db.Integer, primary_key=True)
    date_created = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
    marks_obtained = db.Column(db.Integer, nullable=False, default=0)
    response = db.Column(db.Text(), nullable=True)
    stud_id = db.Column(db.Integer, db.ForeignKey('student.id'), nullable=False)
    quiz_id = db.Column(db.Integer, db.ForeignKey('quiz.id'), nullable=False)

Код должен позволить мнесделать что-то вроде этого -

current_user.student.name = 'John Doe' или current_user.teacher.subject = 'Math'

...