簡體   English   中英

如何基於SqlAlchemy關系設置模型默認值?

[英]How can I set model defaults based on a SqlAlchemy relationship?

假設我有以下模型:

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)

我希望能夠將Shipment.ship_date默認設置為Treatment.treatment_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)

但這會引發TypeError,因為SqlAlchemy尚未設置self.customer字段。

似乎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>

雖然這很煩人,而且我不確定為什么在創建一側時SQLAlchemy不會填充雙向關系,但是可以通過手動設置兩側的關系來解決。 例如:

new_shipment = Shipment(customer=customer)
new_shipment.ship_date # 11/01/2017
customer.shipments.append(new_shipment)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM