2017-07-19 26 views
0

送信メール(子)、送信元(親1)、およびターゲット(親2)の間に1対多の関係を試みます。データベースの設定にflask-migrateを使用しようとしています。1対多の関係| Flask-SQLAlchemyおよびFlask-Migrate

python manage.py db migrate 

を次のエラーを取得する:ここで

sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'outbound_emails.target_id' could not find table 'targets' with which to generate a foreign key to target column 'id' 

は、私がこれまで持っているものだ。誰も私が間違ってここにやって

class Contact(Base): 
    __abstract__ = True 
    id = db.Column(db.Integer, primary_key=True) 
    first_name = db.Column(db.Text, nullable=False) 
    last_name = db.Column(db.Text, nullable=False) 
    email = db.Column(db.Text, nullable=False) 
    phone = db.Column(db.Text, nullable=False) 
    created_at = db.Column(db.DateTime, default=datetime.utcnow()) 
    last_activity = db.Column(db.DateTime, default=datetime.utcnow()) 
    json_data = db.Column(sqlalchemy.dialects.postgresql.JSON) 

    def __init__(self, first_name, last_name, email, phone, 
       created_date=datetime.utcnow(), last_activity=datetime.utcnow(), json_data=None): 
     if json_data is None: 
      json_data = {} 
     self.first_name = first_name 
     self.last_name = last_name 
     self.email = email 
     self.phone = phone 
     self.created_date = created_date 
     self.last_activity = last_activity 
     self.json_data = json_data 


class Target(Contact): 
    __tablename__ = 'targets' 
    outbound_emails = db.relationship("OutboundEmail", backref="target", lazy='dynamic') 

    @property 
    def __repr__(self): 
     return '<target_id {}>'.format(self.target_id) 


class Source(Contact): 
    __tablename__ = 'sources' 
    outbound_emails = db.relationship("OutboundEmail", backref="source", lazy='dynamic') 

    @property 
    def __repr__(self): 
     return '<source_id {}>'.format(self.source_id) 


class OutboundEmail(db.Model): 
    __tablename__ = 'outbound_emails' 
    email_id = db.Column(db.Integer, primary_key=True) 
    provider_id = db.Column(db.Text, nullable=True) 
    source_id = db.Column(db.Integer, db.ForeignKey("sources.id")) 
    target_id = db.Column(db.Integer, db.ForeignKey("targets.id")) 
    data = db.Column(sqlalchemy.dialects.postgresql.JSON) 

    def __init__(self, provider_id, source, target, merge_fields): 
     self.provider_id = provider_id 
     self.source = source 
     self.target = target 
     self.data = merge_fields 


    @property 
    def __repr__(self): 
     return '<email_id {}>'.format(self.email_id) 

見ない私が使用しているコマンド?ありがとう!

答えて

0

解決策は、達成しようとしている継承の種類(単一テーブル、具象テーブル、または結合テーブル継承)によって異なる場合があります。

私はあなたがこれ具体的な相続の形式を使用して、独自の個別の表に、各サブクラスにマップしたいとし_abstract_として、あなたの基本クラスをマークしていることを考えると。

この場合、すべての列を各サブクラスで明示的に定義する必要があります(同じ名前のものも含めて)。だから、少なくともあなたは:

id = db.Column(db.Integer, primary_key=True) 

派生クラスで設定する必要があります。

さらに、多型IDをサブクラスに設定し、ポリモーフィックな読み込みを可能にするために多型IDを拡張する必要があります。このトピックについてはwonderful SQLAlchemy documentationをご覧ください。