簡體   English   中英

如何在SQLAlchemy中與關聯對象(沒有關聯代理)建立多對多關系?

[英]How can I access extra columns in SQLAlchemy a many-to-many relationship with an association object (without an association proxy)?

我在SQLAlchemy中定義了一個多對多關系,其中我在兩個模型之間使用了一個關聯對象,我需要能夠訪問額外列中的數據,就像它是集合中模型的一部分一樣

我在不能使用關聯代理的約束條件下構建此對象,必須使用relationship來定義集合

到目前為止,我制作了一個簡單的模式

class Blueprint(Base):
    __tablename__ = 'blueprints'
    id = Column(Integer, primary_key=True)
    name = Column(String, nullable=False)
    spec = Column(JSONB, nullable=False)
    parts = relationship('parts', secondary='blueprint_parts', lazy='dynamic')


class BlueprintParts(Base):
    __tablename__ = 'blueprint_parts'
    id = Column(Integer, primary_key=True)
    blueprint_id = Column(Integer, ForeignKey('blueprints.id'), primary_key=True)
    part_id = Column(Integer, ForeignKey('parts.id'), primary_key=True)
    extra_data = Column(String)

class Parts:
    __tablename__ = 'parts'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    vendor = Column(String)

我想如何使用這種關系的簡短示例(啟用了自動提交)

b = Blueprint.query(id=42).one_or_none()
for p in b.parts:
    print(p.extra_data)
    print(p.name)
    if condition:
        p.extra_data = "blah"

當前, p.parts中的所有對象p.parts包含extra_data Parts定義的屬性

通過模式和代碼中的一些變通辦法,我能夠實現所需的行為

class Blueprint(Base):
    __tablename__ = 'blueprints'
    id = Column(Integer, primary_key=True)
    name = Column(String, nullable=False)
    spec = Column(JSONB, nullable=False)
    blueprint_parts = relationship('BlueprintParts', lazy='dynamic')


class BlueprintParts(Base):
    __tablename__ = 'blueprint_parts'
    id = Column(Integer, primary_key=True)
    blueprint_id = Column(Integer, ForeignKey('blueprints.id'), primary_key=True)
    part_id = Column(Integer, ForeignKey('parts.id'), primary_key=True)
    extra_data = Column(String)
    part = relationship('Parts', lazy='joined')

class Parts:
    __tablename__ = 'parts'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    vendor = Column(String)

代碼如下

b = Blueprint.query(id=42).one_or_none()
part = Parts(name='some_name', vendor='some_vendor')
blueprint_part = BlueprintParts(extra_data='something', part=part)
b.blueprint_parts.append(blueprint_part)

for p in b.blueprint_parts:
    print(p.extra_data)
    # Access part via p.part
    print(p.part.name)

暫無
暫無

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

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