[英]Self-referencing many-to-many relationship with an association object in 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.