使用Flask-Permissions UserMixin修改模型后,模型无法找到外键关系

时间:2017-08-17 10:19:23

标签: python python-3.x flask sqlalchemy

我正在使用Flask-Permissions库来设置一些基本权限系统。

在User类中,我将db.Model替换为Flask-Permissions中的UserMixin

一切都应该通过,但SQLAlchemy会抛出错误

  

sqlalchemy.exc.NoForeignKeysError:找不到'fp_user'和'user'之间的任何外键关系。

这看起来不太好。我认为UserMixin已经从db.Model继承。

这是我当前的代码

Class User(UserMixin):
    __tablename__ = "user"

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    first_name = db.Column(db.String(50), nullable=False)
    last_name = db.Column(db.String(50), nullable=False)
    email = db.Column(db.String(255), unique=True, nullable=False)
    storage_hash = db.Column(db.String(255), unique=True)
    password = db.Column(db.String(255), nullable=False)
    profile_picture = db.Column(db.String(255))
    gender = db.Column(db.Enum('male', 'female', name='gender'))
    registered_on = db.Column(db.Date, nullable=False)
    last_activity = db.Column(db.DateTime)
    role = db.Column(
    db.Enum('student', 'teacher', 'secretary', 'debuty_director', 'director', 'supervisor', name='user_role'),
    nullable=False)
    credit = db.Column(db.Float, default=0)
    school_id = db.Column(db.Integer, db.ForeignKey('school.id'), nullable=True)
    file = db.relationship('File', backref='user', lazy='dynamic')
    class_id = db.Column(db.Integer, db.ForeignKey('class.id'), nullable=True)
    storage = db.relationship('UserStorage', uselist=False, backref='user')
    payments = db.relationship('UserPayments', uselist=False, backref='user')

    def __init__(self, first_name, last_name, email, password, school_id=None, role='student', gender='male'):
        UserMixin.__init__(self, role)
        self.first_name = first_name
        self.last_name = last_name
        self.email = email
        self.storage_hash = strgen.StringGenerator('[\w\d]{20}').render()
        os.mkdir(app.config['UPLOAD_FOLDER'] + self.storage_hash)
        self.password = bcrypt.generate_password_hash(
        password, app.config.get('BCRYPT_LOG_ROUNDS')
    ).decode('utf-8')
        shutil.copy(app.config['IMAGES_FOLDER'] + 'resources/users/default_{}.png'.format(gender),
                '{}/{}/'.format(app.config['UPLOAD_FOLDER'], self.storage_hash))
        self.profile_picture = 'user_files/{}/default_{}.png'.format(self.storage_hash, gender)
        self.gender = gender
        self.registered_on = datetime.datetime.now()
        self.role = role
        self.school_id = school_id
        storage = UserStorage()

        db.session.add(storage)
        db.session.commit()

        self.storage_id = storage.id

为什么我会收到此异常?

2 个答案:

答案 0 :(得分:0)

问题在于tablename。我的__tablename__设置为user,但在Flask-Permissions UserMixin表中设置为fp_user。我必须删除表名或将其替换为库。

更好的选择是使用Flask-Permissions SQLAlchemy-Permissions

的分叉

答案 1 :(得分:0)

我遇到了同样的问题。

pip install Flask-Permissions安装的版本已过时(2014)。 UserMixin类已于2016年更新,因此您的User类可以继承它。

相反,您应该安装github上可用的最新版本: pip install git+https://github.com/raddevon/flask-permissions.git