使用flask_sqlalchemy 创建多对多关系

时间:2021-07-20 20:03:09

标签: python flask flask-sqlalchemy

我想在用户和事件之间建立关系。我希望用户能够注册活动。

我已经有一个关于一对多关系的用户和事件模型

用户模型

class User(db.Model,UserMixin):

  __tablename__ = 'users'

  id = db.Column(db.Integer,primary_key = True)
  .........
  events = db.relationship('Event',backref='organiser', lazy=True)

##events 模型

class Event(db.Model):

    __tablename__ = 'events'

    id = db.Column(db.Integer,primary_key = True)
    ........
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)

我需要帮助来创建用户注册表。该表应包含其他字段,而不仅仅是事件和用户 ID

我希望能够进行类似的查询

user.event_registrations
event.event_registrations
event.event_registrations.users
user.events

这是我按照文档创建表格的尝试。

class EventRegistration(db.Model):
    __tablename__ = 'event_registrations'
    user_id = Column(ForeignKey('users.id'), primary_key=True)
    event_id = Column(ForeignKey('events.id'), primary_key=True)
    extra_data1 = Column(String(50))
    extra_data2 = Column(String(50))
    event = db.relationship("Event", back_populates="users")
    user = db.relationship("Member", back_populates="events")

class User(db.Model):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    ....
    events = db.relationship("EventRegistration", back_populates="user")

class Event(db.Model):
    __tablename__ = 'events'
    id = Column(Integer, primary_key=True)
    ....
    users = db.relationship("EventRegistration", back_populates="event")

帮助正确设置数据库 谢谢

2 个答案:

答案 0 :(得分:0)

您还没有创建真正的 many-to-many 关系,您已经创建了一些 one-to-many 关系。

为了说明这一点,在多对多关系中,User.events 会给您一个 Events 列表。在您的情况下,您将获得 EventRegistrations 的列表。

话虽如此,您可能不需要走多对多路线,您只需要修复您的一对多关系。 docs 可以帮助解决这个问题,但看起来您正在混合 ForeignKeysprimary_keys。不要这样做,并按照文档中的示例进行操作。

答案 1 :(得分:0)

创建多对多关系的正确方法是创建关联表

Events=db.Table('Events',
db.Column(db.Integer,db.ForeignKey('user.id'),primary_key=True),
db.Column(db.Integer,db.ForeignKey('event.id'),primary_key=True)
)

        class User(db.Model,UserMixin):
        
          __tablename__ = 'users'
        
          id = db.Column(db.Integer,primary_key = True)
          .........
          events = db.relationship('Event',secondary=Events,backref='organiser', lazy=True)
    
    class Event(db.Model):
    
        __tablename__ = 'events'
    
        id = db.Column(db.Integer,primary_key = True)
        ........

如果您想了解更多关于多对多的信息,我建议您阅读此Article