2016-05-18 18 views
1

ユーザーがドライバとマネージャの両方になることができる場所追跡アプリケーションを構築しています。Flask-SqlAlchemyの継承

ドライバとマネージャには2種類のアプリがあります。ユーザーは、同時にマネージャとドライバの両方になることができます。

だから、私のようなモデルがあります:

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の2つのフラグをマークできます。

ドライバとマネージャの関数をUserクラスにリンクして書く方法より前が正しい場合は、

+0

いずれの場合も、お使いのアプリケーションによっては正しくなる可能性があります。ほとんどの場合、デフォルトの '__init__'をオーバーライドする必要はありません。デフォルトの '__init__'はキーワード引数をとり、インスタンスに設定します。 – univerio

答えて

1

あなたはほとんど間違いなく、ユーザーモデルを継承したくありません。個々のユーザーに2つの異なる有効な「ユーザー」行があるため、個々のユーザーを追跡するのが非常に困難になります。また

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') 

、あなたは一般的に__init__メソッドをオーバーライドする必要はありません。私は個人的のようなものをお勧めします。この時点で、ドライバー/マネージャーをかなり簡単に設定することができます。

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() 
+0

私のためにうまく動作します。 id:db.Column(db.Integer); id = db.Columnのように、user.idを持つDriver.idまたはManager.idを1つのフィールドにコンバートすることもできます( 'children'モデルでは別のuser_idフィールドを使用しない場合) 'id = db.Column 、db.ForeignKey( 'user.id')、primary_key = True) ' ' user_id '列を取り除く – kip2