我想在用户和事件之间建立关系。我希望用户能够注册活动。
我已经有一个关于一对多关系的用户和事件模型
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")
帮助正确设置数据库 谢谢
答案 0 :(得分:0)
您还没有创建真正的 many-to-many 关系,您已经创建了一些 one-to-many 关系。
为了说明这一点,在多对多关系中,User.events
会给您一个 Events
列表。在您的情况下,您将获得 EventRegistrations
的列表。
话虽如此,您可能不需要走多对多路线,您只需要修复您的一对多关系。 docs 可以帮助解决这个问题,但看起来您正在混合 ForeignKeys
和 primary_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