簡體   English   中英

SQLAlchemy 將多對多連接表映射到鍵列表

[英]SQLAlchemy mapping many-to-many join table to list of keys

我有兩個具有多對多關系的表:

purchase_order = Table(
    "purchase_order",
    metadata,
    Column("name", String, nullable=False, primary_key=True),
    ...
)

shipment = Table(
    "shipment",
    metadata,
    Column("identifier", String, nullable=False, primary_key=True),
)

shipment_po = Table(
    "shipment_po",
    metadata,
    Column(
        "shipment_identifier",
        String,
        ForeignKey("shipment.identifier"),
        nullable=False,
        primary_key=True,
    ),
    Column(
        "purchase_order_name",
        String,
        ForeignKey("purchase_order.name"),
        nullable=False,
        primary_key=True,
    ),
)

我想像這樣將 map 轉換為 class :

class Shipment:
    def __init__(
        self,
        identifier: str,
        purchase_order_names: list[str],
    ):
    ...

(注意 purchase_order_names 只是 str 的列表,而不是某些PurchaseOrder object 的列表。)

這樣我就可以像這樣創建它們(我有責任確保此處存在 purchase_order 行):

session.add(Shipment("my_shipment", purchase_order_names=["my_po_1", "my_po_2"]))

像這樣獲取:

session.query(Shipment).filter_by(identifier="my_shipment").one()

並像這樣更新:

shipment.purchase_order_names.append("my_po_3")

這支持嗎?

您可以通過向 Shipment 添加一個驗證器來執行此操作,該驗證器PurchaseOrder from the provided name

from sqlalchemy import orm

class Shipment:
    ...
    @orm.validates('purchase_orders')
    def validate_purchase_orders(self, key, purchase_order):
        return PurchaseOrder(name=purchase_order)

如果您需要更多控制權,您可以創建自定義集合 class

暫無
暫無

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

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