Ola*_*ola 19 python sqlalchemy m2m flask flask-sqlalchemy
我有 2 张桌子:餐厅和食物,第三张桌子 restaurant_foods 存储两张桌子之间的多对多关系
restaurants_foods = db.Table('restaurants_foods',
db.Column('restaurant_id', db.Integer, db.ForeignKey('restaurants.id'), primary_key=True),
db.Column('food_id', db.Integer, db.ForeignKey('foods.id'), primary_key=True),
db.Column('food_price', db.Float)
)
class Food(Model):
__tablename__ = "foods"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(255), nullable=False)
description = db.Column(db.String(255), nullable=True)
class Restaurant(Model):
__tablename__ = "restaurants"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(255), nullable=False)
foods = db.relationship('Food', secondary=restaurants_foods)
Run Code Online (Sandbox Code Playgroud)
现在,当我查询 Restautant.query.get(1).foods 时,我希望它包含 restaurant_foods 关联表中的 food_price 列
小智 7
您必须使用关联对象模式(是多对多定义的变体):当您的关联表包含除左右表的外键之外的其他列时使用它。您不使用relationship.secondary 参数,而是将一个新类直接映射到关联表。关系的左侧通过一对多引用关联对象,关联类通过多对一引用右侧。下面说明了映射到 Association 类的关联表,其中包含一个名为 extra_data 的列,它是一个字符串值,与父子之间的每个关联一起存储:
class Association(Base):
__tablename__ = 'association'
left_id = Column(Integer, ForeignKey('left.id'), primary_key=True)
right_id = Column(Integer, ForeignKey('right.id'), primary_key=True)
extra_data = Column(String(50))
child = relationship("Child", back_populates="parents")
parent = relationship("Parent", back_populates="children")
class Parent(Base):
__tablename__ = 'left'
id = Column(Integer, primary_key=True)
children = relationship("Association", back_populates="parent")
class Child(Base):
__tablename__ = 'right'
id = Column(Integer, primary_key=True)
parents = relationship("Association", back_populates="child")
Run Code Online (Sandbox Code Playgroud)
请查看在 SQLAlchemy 中配置多对多关系。你会想要这样的东西:
restaurants_foods = db.Table('restaurants_foods',
db.Column('restaurant_id', db.Integer, db.ForeignKey('restaurants.id'), primary_key=True),
db.Column('food_id', db.Integer, db.ForeignKey('foods.id'), primary_key=True),
db.Column('food_price', db.Float))
class Food(Model):
__tablename__ = "foods"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(255), nullable=False)
description = db.Column(db.String(255), nullable=True)
restaurants = relationship(
"Restaurant",
secondary=restaurant_foods,
back_populates="foods"
)
class Restaurant(Model):
__tablename__ = "restaurants"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(255), nullable=False)
foods = relationship(
"Food",
secondary=restaurant_foods,
back_populates="restaurants"
)
Run Code Online (Sandbox Code Playgroud)