2017-12-08 10 views
0

のは、私は次のモデルがあるとしましょう:SqlAlchemy関係に基づいてモデルのデフォルトを設定するにはどうすればよいですか?

class Customer(Model): 
    __tablename__ = 'customer' 
    id = Column(Integer()) 
    treatments = relationship('Treatment', back_populates='customer') 
    shipments = relationship('Shipment', back_populates='customer') 

class Treatment(Model): 
    __tablename__ = 'treatment' 
    customer_id = Column(Integer(), ForeignKey('customer.id')) 
    customer = relationship('Customer', back_populates='treatments') 
    treatment_date = Column(DateTime(), nullable=False) 

class Shipment(Model): 
    __tablename__ = 'shipment' 
    customer_id = Column(Integer(), ForeignKey('customer.id')) 
    customer = relationship('Customer', back_populates='shipments') 
    ship_date = Column(DateTime(), nullable=False) 

私はTreatment.treatment_date前日であることをShipment.ship_dateをデフォルトにできるようにしたいと思います。言い換えれば、私は次の操作を実行したい:

customer = Customer() 
treatment = Treatment(treatment_date="11/02/2017") 
customer.treatments.append(treatment) 
shipment = Shipment() 
customer.shipments.append(shipment) 
shipment.ship_date 
# 11/01/2017 

彼らはappendのような方法で動的に設定しているとき、私は関係に基づいてデフォルト値を設定するにはどうすればよいですか?


明確にするために、これはSqlAlchemyとリレーションシップが設定されているときの質問です。

class Shipment(Model): 
    # ...same set up as above 
    def __init__(self, **kwargs): 
     super().__init__(**kwargs) 
     self.ship_date = self.customer.treatments[0].treatment_date - timedelta(1) 

をしかし、SQLAlchemyのはまだself.customerフィールドを設定していないので、それは例外TypeError:たとえば、私は次のことを試してみました。

+0

顧客は多くの治療(および多くの出荷)を行うことができるため、どの治療を出荷日から受け取るかはどのように決定しましたか? –

+0

実際には、treatment_dateに基づいて最も早い処理を使用します。ここでは単純化のためにインデックス0を使用するようにコードを変更しました。 – maherio

答えて

0

SQLAlchemyは、モデルが追加されてセッションにコミットされるまで、両方の関係を構成しないように見えます。これは迷惑であると私は片側が作成されたときにSQLAlchemyの双方向の関係を移入しない理由はわからないものの

customer.shipments.append(new_shipment) 
customer.shipments # includes the new shipment 
new_shipment.customer # None 
session.add(customer) 
session.commit() 
new_shipment.customer # <Customer object> 

、それを手動両側の関係を設定することによって解決することができます。例:

new_shipment = Shipment(customer=customer) 
new_shipment.ship_date # 11/01/2017 
customer.shipments.append(new_shipment) 
関連する問題