2012-02-21 5 views
1

私はLocationクラスを持っています。場所には、住所でもあるデフォルトの「請求書住所」を設定することができます。私が作業しているフィールドはCustomerLocationクラスのbill_to_idbill_toです。私は完全性のために親クラスを含んでいます。ある場所を別の場所の請求先として設定するにはどうすればよいですか?関係は1対1でなければなりません(場所には請求書が1つしかありません)。逆参照は必要ありません。SQLAlchemy、同じテーブルの1対1の関係

TIA

class Location(DeclarativeBase,TimeUserMixin): 
    __tablename__ = 'locations' 

    location_id = Column(Integer,primary_key=True,autoincrement=True) 
    location_code = Column(Unicode(10)) 
    name = Column(Unicode(100)) 
    address_one = Column(Unicode(100)) 
    address_two = Column(Unicode(100)) 
    address_three = Column(Unicode(100)) 
    city = Column(Unicode(100)) 
    state_id = Column(Integer,ForeignKey('states.state_id')) 
    state_relate = relation('State') 
    zip_code = Column(Unicode(100)) 
    phone = Column(Unicode(100)) 
    fax = Column(Unicode(100)) 
    country_id = Column(Integer,ForeignKey('countries.country_id')) 
    country_relate = relation('Country') 
    contact = Column(Unicode(100)) 
    location_type = Column('type',Unicode(50)) 

    __mapper_args__ = {'polymorphic_on':location_type} 

class CustomerLocation(Location): 
    __mapper_args__ = {'polymorphic_identity':'customer'} 
    customer_id = Column(Integer,ForeignKey('customers.customer_id', 
              use_alter=True,name='fk_customer_id')) 
    customer = relation('Customer', 
         backref=backref('locations'), 
         primaryjoin='Customer.customer_id == CustomerLocation.customer_id') 
    tbred_ship_code = Column(Unicode(6)) 
    tbred_bill_to = Column(Unicode(6)) 
    ship_method_id = Column(Integer,ForeignKey('ship_methods.ship_method_id')) 
    ship_method = relation('ShipMethod',primaryjoin='ShipMethod.ship_method_id == CustomerLocation.ship_method_id') 
    residential = Column(Boolean,default=False,nullable=False) 
    free_shipping = Column(Boolean,default=False,nullable=False) 
    collect = Column(Boolean,default=False,nullable=False) 
    third_party = Column(Boolean,default=False,nullable=False) 
    shipping_account = Column(Unicode(50)) 
    bill_to_id = Column(Integer,ForeignKey('locations.location_id')) 
    bill_to = relation('CustomerLocation',remote_side=['locations.location_id']) 

答えて

2

answer to a related questionを参照してください。表の自己参照外部キーを宣言し、クラスが宣言された直後に「モンキー・パッチ」を適用するか、外部フィールド名をクラス・フィールドではなく文字列として指定することで、宣言的な自己参照関係を持つことができます。例:

class Employee(Base): 
    __tablename__ = 'employee' 
    id = Column(Integer, primary_key=True) 
    name = Column(String(64), nullable=False) 
Employee.manager_id = Column(Integer, ForeignKey(Employee.id)) 
Employee.manager = relationship(Employee, backref='subordinates', 
    remote_side=Employee.id) 

私はあなたに(単一の親が複数の子レコードを持つことができます)親子ツリー関係の両方の方向を与える前に、この技術を成功裏に使用しました。 backref引数を省略すると、あなたのためにうまく動作しない場合があります。アプリケーションでは、常に関係の方向を1つだけ選択することができます。

+0

私はそれを文字列で処理することはできませんでしたが、あなたの明示的な例の従業員宣言を使用して、動作しました。ありがとうございました! – jheld