Flask Объект RESTplus не имеет атрибута _sa_instance_state - PullRequest
0 голосов
/ 30 апреля 2020

NB: Я прочитал другие вопросы об этой ошибке:

state = attributes.instance_state(instance)
AttributeError: 'Teacher' object has no attribute '_sa_instance_state'

sqlalchemy.orm.exc.UnmappedInstanceError: Class 'fopd.main.controller.user_controller.Teacher' is not mapped

, но я все еще не могу отладить ее

Я новичок в Flask и я пытаюсь добавить новую учетную запись Учителя в свою базу данных, определение модели здесь:

# inheritance declares the class as SQLAlchemy class
class User(db.Model):
   """ User Model for storing user related details """

   # db table name
   __abstract__ = True

   # db columns
   fname = db.Column(db.String(30))
   lname = db.Column(db.String(30))
   #registered_on = db.Column(db.DateTime, default = datetime.datetime.utcnow)
   password_hash = db.Column(db.String(100), nullable = False)
   public_id = db.Column(db.String(100), unique = True)

   def __repr__(self):
      return f'User({fname})'


   @property
   def password(self):
      raise AttributeError('password: write-only field')

   @password.setter
   def password(self, password):
      self.password_hash = flask_bcrypt.generate_password_hash(password).decode('utf-8')

   def check_password(self, password):
      return flask_bcrypt.check_password_hash(self.password_hash, password)

   def encode_auth_token(self, user_id):
      """
      Generates the Auth Token
      :return: string
      """
      try:
         payload = {
            'exp': datetime.datetime.utcnow() + datetime.timedelta(days=1, seconds=5),
            'iat': datetime.datetime.utcnow(),
            'sub': user_id
         }
         return jwt.encode(payload, key, algorithm='HS256')
      except Exception as e:
         return e

   @staticmethod  
   def decode_auth_token(auth_token):
      """
      Decodes the auth token
      :param auth_token:
      :return: integer|string
      """
      try:
         payload = jwt.decode(auth_token, key)
         is_blacklisted_token = BlacklistToken.check_blacklist(auth_token)
         if is_blacklisted_token:
            return 'Token blacklisted. Please log in again.'
         else:
            return payload['sub']
      except jwt.ExpiredSignatureError:
         return 'Signature expired. Please log in again.'
      except jwt.InvalidTokenError:
         return 'Invalid token. Please log in again.'

   def __repr__(self):
      return "<User '{}'>".format(self.username)

class Teacher(User):
   __tablename__ = "teacher"

   userId = db.Column(db.Integer, primary_key = True, autoincrement = True)
   username = db.Column(db.String(50), nullable = False, unique = True)

   # relationships
   students = db.relationship('Student', backref = 'teacher', lazy = True, cascade = 'all, delete-orphan')
   experiments = db.relationship('Experiment', backref = 'teacher', lazy = True, cascade = 'all, delete-orphan')
   device = db.relationship('Device', backref = 'teacher', lazy = True, cascade = 'all, delete-orphan')
   course = db.relationship('Class', backref = 'teacher', lazy = True)
   assignments = db.relationship('Assignment', backref = 'teacher', lazy = True, cascade = 'all, delete-orphan')

   def __str__(self):
      return f"Teacher('{self.username}', '{self.public_id}')"

   def __repr__(self):
      return self.__str__()

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


Я до сих пор не понимаю, в чем причина ошибки

   def save_teacher(teacher):
      try:
         db.session.add(teacher)
         db.session.commit()
      except sqlalchemy.exc.OperationalError as e:
         print(e)
         print('[ERROR] error occured saving teacher account')
         return False
      return True


      ### there is some code I am omitting
      data = request.json
      ### check data is not null
      new_teacher = Teacher(
         username = data['username'],
         # password = data['password'], # maybe
         # fname = data.get('fname', None),
         # lname = data.get('lname', None)
      )
      print(new_teacher)

      created = UserService.save_teacher(new_teacher)

Я не уверен, так ли это, потому что я наследую абстрактную модель пользователя или нет. Но когда я выполняю это (не метод db.session.save(),commit() в интерпретаторе python, все работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...