Python 从用户表继承的最佳方式(SQLAlchemy和UserMixin)

Python 从用户表继承的最佳方式(SQLAlchemy和UserMixin),python,flask,sqlalchemy,Python,Flask,Sqlalchemy,我有一张SQLALchemy表: class User(db.Model, UserMixin): user_id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(100), nullable=False, unique=True) password_hash = db.Column(db.String(40), nullable=False) 但我希望用户能够通过使用用户

我有一张SQLALchemy表:

class User(db.Model, UserMixin):
    user_id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(100), nullable=False, unique=True)
    password_hash = db.Column(db.String(40), nullable=False)
但我希望用户能够通过使用用户名和密码创建新帐户,或者使用社交媒体帐户google/twitter/vk.com登录和注册。我的想法是建立一个基本用户表,其中包含抽象方法,如get_name,必须在每个社交媒体的派生表中定义

此的伪代码:

基本用户

class User(db.Model, UserMixin):
    user_id = db.Column(db.Integer, primary_key=True)

    # Overridden method from UserMixin
    def get_id(self):
        return self.user_id

    def get_name(self): raise NotImplementedError
谷歌用户

class GoogleUser(User):

    first_name = db.Columnn(db.String(40), nullable=False)
    last_name = db.Columnn(db.String(40), nullable=False)

    def get_name(self):
        return '{} {}'.format(self.first_name, self.last_name)

电子邮件用户

class EmailUser(User):
    username = db.Column(db.String(100), nullable=False, unique=True)
    password_hash = db.Column(db.String(40), nullable=False)

    def get_name(self):
        return self.username

问题是用SQLAlchemy和UserMixin实现它的最佳方式是什么?
提前感谢您的帮助。

我通常做的是创建一个包含应用程序所需所有信息的用户模型,例如

class User(db.Model, UserMixin):
    user_id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(100), nullable=False, unique=True)
    password_hash = db.Column(db.String(40), nullable=True)
然后,对于第三方服务身份验证,我创建了一个表,该表存储应用程序所需的令牌和有关该服务的其他相关数据

class GoogleUser(db.Model):

    first_name = db.Column(db.String(40), nullable=False)
    last_name = db.Column(db.String(40), nullable=False)
    google_token = db.Column(db.String(200), nullable=False)
我通过外键将此新表连接到用户模型:

google_user_id = db.Column(db.Integer, db.ForeignKey("google_user.id"))
这样,用户可以轻松地连接他们的第三方帐户,并在您的应用程序上拥有一个帐户

Facebook登录也建议这样做

希望它能把事情弄清楚