Flask-sqlalchemy данные взаимосвязи «многие ко многим»

#python #flask #flask-sqlalchemy

#python #flask #flask-sqlalchemy

Вопрос:

Я пытаюсь создать приложение, подобное discord, но мне не удалось правильно установить взаимосвязь. Я использую ассоциативную таблицу «участники» для привязки пользователей к серверу. Я считаю, что пользователи и серверы должны хранить копию взаимосвязи, чтобы пользователь мог распечатать все серверы, к которым он подключен, и сервер мог видеть всех своих членов. Это код, который у меня есть на данный момент.

 members = db.Table('members',
    db.Column('member_id', db.Integer, db.ForeignKey('user.id')),
    db.Column('workspace_id', db.Integer, db.ForeignKey('workspace.id')))

class User(db.Model):
    __tablename__="user"
    id=db.Column(db.Integer,primary_key=True)
    username=db.Column(db.String,nullable=False, unique=True)
    workspaces = db.relationship(
        "Workspace",
        secondary=members,
        primaryjoin=(members.c.workspace_id == id),
        backref=db.backref('members', lazy='dynamic'), lazy='dynamic')


class Workspace(db.Model):
    __tablename__="workspace"
    id=db.Column(db.Integer,primary_key=True)
    workspaceName=db.Column(db.String,nullable=False)
    subgroups=db.relationship("subGroup",backref="workspace",lazy=True)
    code = db.Column(db.String, nullable=False)
    users = db.relationship(
        "User",
        secondary=members,
        primaryjoin=(members.c.member_id == id),
        backref=db.backref('members', lazy='dynamic'), lazy='dynamic')
  

Я добавляю с обеих сторон взаимосвязи или просто добавляю один раз?

Комментарии:

1. Ваше использование неверно. users = db.relationship(User, secondary=members, backref=db.backref('workspaces', lazy='dynamic'), lazy='dynamic') этого достаточно для вас.

2. @Yangghg Это для класса Workspace, верно? Итак, мне нужно добавить только один раз, например user.members.append (workspace), и это должно сработать?

3. У пользователей существует members.c.workspace_id == id в качестве условия primaryjoin, но идентификатор равен Users.id так что это не имеет смысла. Аналогично в Workspace для member_id.