Python 炼金术与外场的多对多关系

Python 炼金术与外场的多对多关系,python,flask,sqlalchemy,flask-sqlalchemy,m2m,Python,Flask,Sqlalchemy,Flask Sqlalchemy,M2m,我有两张桌子:餐馆和食品,第三张桌子是餐馆和食品,它存储了两张桌子之间的多对多关系 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'),

我有两张桌子:餐馆和食品,第三张桌子是餐馆和食品,它存储了两张桌子之间的多对多关系

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)

现在,当我查询Restautant.query.get(1.foods)时,我希望它包括餐馆食品关联表中的食品价格列

请查看在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"
    )
您必须使用一种模式(是多对多定义的变体):当您的关联表包含除左右表外键以外的其他列时,将使用该模式。不使用relationship.secondary参数,而是将新类直接映射到关联表。关系的左侧通过一对多引用关联对象,关联类通过多对一引用右侧。下图显示了映射到关联类的关联表,该关联表包括一个名为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")

我也有同样的问题,但我使用了
关联对象
而不是
db.Table
。它位于@mam8cc提供的同一链接中,只是下面的一部分:“我希望它包括餐馆食品协会表中的食品价格栏”。这个答案不能回答这个问题。