Python 炼金术中的遗传

Python 炼金术中的遗传,python,sqlalchemy,flask-sqlalchemy,Python,Sqlalchemy,Flask Sqlalchemy,我正在构建一个位置跟踪应用程序,其中一个用户既可以是司机也可以是经理 司机和经理有两种不同的应用程序。用户可以同时是管理员和驱动程序 因此,我有一个模型如下: class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String, nullable=False) def __init__(self, name): self.name =

我正在构建一个位置跟踪应用程序,其中一个用户既可以是司机也可以是经理

司机和经理有两种不同的应用程序。用户可以同时是管理员和驱动程序

因此,我有一个模型如下:

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String, nullable=False)

    def __init__(self, name):
        self.name = name

class Driver(User):
    driving_license = db.Column(db.String)

    def __init__(self, driving_license):
        self.driving_license)

class Manager(User):
    designation = db.Column(db.String)
这是正确的方法吗?或者我应该设计一个用户类和单独的驱动程序和管理器类,而不从用户类继承。在后一种情况下,我可以标记两个标志is_driver和is_manager


如果前者是正确的,那么如何通过将其链接到用户类来编写驱动程序和管理器的init函数。

您几乎肯定不想继承用户模型。这将使跟踪单个用户变得非常困难,因为对于单个用户,将有两个不同的有效“用户”行。我个人建议如下:

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String, nullable=False)
    driver = db.relationship('Driver', uselist=False, back_populates='user')
    manager = db.relationship('Manager', uselist=False, back_populates='user')

class Driver(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    driving_license = db.Column(db.String)
    user_id = db.Column(db.Integer, ForeignKey('user.id'))
    user = db.relationship('User', back_populates='driver')

class Manager(db.Model):
    id = db.Column(db.Integer, primary_key=True) 
    designation = db.Column(db.String)
    user_id = db.Column(db.Integer, ForeignKey('user.id'))
    user = db.relationship('User', back_populates='manager')
另外,您通常不需要重写
\uuuu init\uuu
方法。因此,在这一点上,我们可以很容易地设置驱动程序/管理器

user = User(name='MyName')
db.session.add(user)
db.session.commit()
manager = Manager(designation='Some designation', user=user)
db.session.add(manager)
db.session.commit()

嗯,根据您的具体应用情况,两者都可能是正确的。在大多数情况下,您不需要覆盖默认的
\uuuuu init\uuuu
;默认的
\uuuuu init\uuuuuu
接受关键字参数并在实例上设置它们。对我来说效果很好。您还可以将Driver.id或Manager.id与user.id组合成一个字段(如果您不想在“子”模型上使用单独的user\u id字段),如下所示:
id=db.Column(db.Integer,db.ForeignKey('user.id'),primary\u key=True)
然后去掉“user\u id”列