繁体   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