【问题标题】:Create An Object With A Many-To-Many Relationship创建具有多对多关系的对象
【发布时间】:2013-02-17 05:27:03
【问题描述】:

如何使用属于组的成员列表初始化一个组对象(并且用户必须知道他们所属的组)

用户有很多组。组有很多用户。

我还在 User 类中尝试了 add_to_group 方法,但并没有真正奏效。

这是我第一次处理多对多关系,所以我还没有弄清楚怎么做,所有的 SO 帖子都指查询多对多关系而不是创建使用的对象他们。

class User(db.Model):
    __tablename__ = 'User'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), unique = False, nullable = False)
    username = db.Column(db.String(80), unique = True, nullable = False)
    fb_id = db.Column(db.String(80), unique = True, nullable = False)
    groups = db.relationship('Groups', secondary=groups, backref=db.backref('User', lazy='dynamic'))

groups = db.Table('groups',
    db.Column('group_id', db.Integer, db.ForeignKey('Group.id')),
    db.Column('user_id', db.Integer, db.ForeignKey('User.id'))
)

class Group(db.Model):
    __tablename__ = 'Group'
    id = db.Column(db.Integer, primary_key=True)
    last_updated = db.Column(db.DateTime, mutable=True)

    def __init__(self):
        self.last_updated = datetime.utcnow();

谢谢!

【问题讨论】:

  • db.backref() 的第一个参数是 backref 属性应该采用的名称,而不是映射类的名称。因此,为了在您的情况下保持一致性,您可能希望将其从 User 更改为 users。这将在Group 类的每个实例上创建一个名为users 的属性。
  • 另外,db.relationship 的第一个参数 关系另一端的类的名称,所以你需要将 Groups 替换为Group.
  • 好的,感谢您的提示。将对我的代码进行适当的更改。

标签: python web-applications sqlalchemy flask-sqlalchemy


【解决方案1】:

在 SQLAlchemy 中,多对多关系被建模为属性,其值为列表。

u = User()
g = [Group(), Group(), Group()]

u.groups = g

您还可以就地更改列表:

g1 = Group()
u.groups.append(g)

关系的另一方也会以同样的方式运作:

g.users.append(User())

当您更改多对多关系的一侧时,SQLAlchemy 会使另一侧保持最新状态 — 换句话说,如果您从 Groupusers 列表中删除 User ,那么Group 将不再出现在Usergroups 列表中。

【讨论】:

  • 好的,谢谢。老实说,当我在等待有人回复时,我实际上是通过阅读 SQLAlchemy 文档而不是 Flask-SQLAlchemy 文档(我在发布之前阅读过的)来解决这个问题的。但是感谢您的帮助!
猜你喜欢
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多