Gewusst wie: laden von verschachtelten Beziehungen in SQLAlchemy?

Auf meine Pyramide+SQLAlchemy website möchte ich einen Kunden, um alle Einkäufe, die er abgegeben hat. Ein Kauf bietet viele Bestellung und eine Bestellung hat viele PurchaseOrderDetail.

Möchte ich, um alle Kauf-Kontext (einschließlich Bestellungen und details) in einer optimierten Art und Weise und deshalb bin ich auf der Suche bei SQLAlchemy laden-Strategien.

Mein Modell Deklaration sieht wie folgt aus:

class Purchase(Base):
    __tablename__ = 'purchase'
    __table_args__ = {'schema':'db','autoload':True}

    customer = relationship(Customer)
    billing_address = relationship(Address,primaryjoin="Address.AddressId==Purchase.BillingAddressId")
    shipping_address = relationship(Address,primaryjoin="Address.AddressId==Purchase.ShippingAddressId")
    orders = relationship(PurchaseOrder)

class PurchaseOrder(Base):
    __tablename__ = 'purchase_order'
    __table_args__ = {'schema':'db','autoload':True}

    company = relationship(Company)
    delivery_service = relationship(DeliveryService)
    details = relationship(PurchaseOrderDetail)

class PurchaseOrderDetail(Base):
    __tablename__ = 'purchase_order_detail'
    __table_args__ = {'schema':'db','autoload':True}

    product_variant = relationship(ProductVariant)

Und was ich möchte, ist etwas in dieser form:

    db_session = DBSession()
    p = db_session.query(Purchase).\
        options(joinedload_all(Purchase.customer,
                                Purchase.billing_address,
                                Purchase.shipping_address)
                ,subqueryload_all(Purchase.orders,
                                Purchase.orders.details)).all()

Jedoch die Purchase.orders.details Teil ist nicht zulässig, und die folgende Ausnahme ausgelöst:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\apps\pyramid\lib\site-packages\sqlalchemy\orm\attributes.py", line 139, in __getattr__
    key)
AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object has an attribute 'details'

So, meine Fragen sind:

  1. Wie kann ich laden Sie die PurchaseOrderDetails beim Abfragen der Kauf
    Modell?
  2. Ist dies der beste Weg, um alle Kaufen conext?

Vielen Dank im Voraus

Schreibe einen Kommentar