繁体   English   中英

使用flask_sqlalchemy 创建多对多关系

[英]create a many to many relationship with 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)

##事件模型

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")

帮助正确设置数据库 谢谢

您还没有创建真正的多对多关系,而是创建了一些一对多关系。

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

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

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

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)
        ........

如果你想了解更多关于多对多的信息,我建议你阅读这篇文章

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM