如何在 Flask-SQLAlchemy 中同时设置一对多和一对一关系?

2024-01-08

我试图在 Flask-SQLAlchemy 中同时创建一对一和一对多关系。我想实现这个目标:

“一个群组有许多成员和一名管理员。”

这是我所做的:

class Group(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(140), index=True, unique=True)
    description = db.Column(db.Text)
    created_at = db.Column(db.DateTime, server_default=db.func.now())

    members = db.relationship('User', backref='group')
    admin = db.relationship('User', backref='admin_group', uselist=False)

    def __repr__(self):
        return '<Group %r>' % (self.name)


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)

    group_id = db.Column(db.Integer, db.ForeignKey('group.id'))
    admin_group_id = db.Column(db.Integer, db.ForeignKey('group.id'))

    created_at = db.Column(db.DateTime, server_default=db.func.now())

但是我得到了一个错误:

sqlalchemy.exc.AmbigouslyForeignKeysError:无法确定连接 关系 Group.members 上父/子表之间的条件 - 有多个外键路径链接表。指定 'foreign_keys' 参数,提供那些列的列表 应被视为包含对父级的外键引用 桌子。

有谁知道如何正确地做到这一点?


解决方案是指定foreign_keys对所有的争论relationships:

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)

    group_id = Column(Integer, ForeignKey('groups.id'))
    admin_group_id = Column(Integer, ForeignKey('groups.id'))

class Group(Base):
    __tablename__ = 'groups'
    id = Column(Integer, primary_key=True)

    members = relationship('User', backref='group', foreign_keys=[User.group_id])
    admin = relationship('User', backref='admin_group', uselist=False, foreign_keys=[User.admin_group_id])

也许可以从另一个方向考虑管理关系来实现“一个组有多个成员和一个管理员”:

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)

    group_id = Column(Integer, ForeignKey('groups.id'))
    group = relationship('Group', foreign_keys=[group_id], back_populates='members')


class Group(Base):
    __tablename__ = 'groups'
    id = Column(Integer, primary_key=True)

    members = relationship('User', foreign_keys=[User.group_id], back_populates='group')

    admin_user_id = Column(Integer, ForeignKey('users.id'))
    admin = relationship('User', foreign_keys=[admin_user_id], post_update=True)

请参阅注释post_update 在文档中 http://docs.sqlalchemy.org/en/latest/orm/relationship_persistence.html#post-update。当两个模型相互依赖、相互引用时,这是必要的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Flask-SQLAlchemy 中同时设置一对多和一对一关系? 的相关文章

随机推荐

  • Netbeans 7.0 的 UML 插件?

    我如何安装 添加 UML 插件到 Netbeans 7 0 我可以找到多种安装插件的方法 但仅限于 6 9 的早期版本 http forums netbeans org topic28035 html http forums netbean
  • OS X Mavericks 上有 PostgreSQL 吗?

    我知道 OS X Mountain Lion 上安装了一个版本的 PostgreSQL 如果你想使用这个数据库引擎 你必须安装一个新版本并进行一些更改 http nextmarvel net blog 2011 09 brew instal
  • 对动态添加的文本使用内联 CKEditor

    我正在构建一个网络应用程序 它使用 javascript 动态地将元素添加到页面 然后可以使用进行编辑contentEditable true and CKEditor 目前 如果我向页面添加一个元素contentEditable true
  • 不使用 jQuery 添加到 DOM

    这应该很简单 但事实并非如此 document getElementsByTagName body 0 document createTextNode document createElement div some HTML div 它创建
  • 类名宏[重复]

    这个问题在这里已经有答案了 可能的重复 CLASSC 中的宏 https stackoverflow com questions 1666802 class macro in c 你好 有没有什么方法可以用宏来获取类的名称 比如 功能 对于
  • 无法覆盖 __call__ 的实现

    以此为例 class Foo object def init self msg self msg msg def call self return self msg foo Foo hello print foo Prints hello
  • 使用 Telnet 或 SSH 与 Perl 从本地计算机在远程计算机上运行 perl 脚本

    我想使用 telnet 或 ssh 在远程计算机上运行 Perl 脚本 该脚本位于我的本地主机上 如何执行此操作 有人可以帮我解决这个问题吗 如果由于某种原因您不想将脚本复制到远程主机然后运行它 您可以通过 stdin 将脚本发送到 Per
  • .NET 3.5 中的 FormsAuthentication.Timeout.TotalMinutes

    我刚刚使用 FormsAuthentication 我想要 Web 配置中表单身份验证标记的超时属性值 在 4 0 中 我们可以通过 FormsAuthentication Timeout TotalMinutes 获取此信息 参考 For
  • socket.io + node.js 的内存泄漏

    我的 Node js 应用程序似乎存在内存泄漏 我很快就构建了它 而且我的 JavaScript 不太强大 所以这可能很容易 我已经对它做了一些堆转储 它是字符串object 内存泄漏 速度约为每 5 分钟 1MB 我扩展了String 它
  • PHP MySQL 计数查询结果是字符串,而不是整数

    我有以下 MySQL 查询和 PHP 代码来格式化Count结果为单个数组 equalDimensions query SELECT allEqual AS COL1 COUNT AS imgCount FROM SELECT imgHei
  • Go 和 PHP 中的 SHA256 给出不同的结果

    我正在尝试通过 HTTP 将 SHA256 哈希字符串发送到服务器 我想通过执行 SHA256 哈希并验证两个匹配来进行身份验证 出于测试目的 我使用相同的字符串 但是我的结果不匹配 这可能是我的 base64 encode 调用的默认编码
  • 为什么我在这个 devise_group 调用中收到 NoMethodError 错误?

    我正在使用 devise 3 5 2 ruby 2 2 2 rails 4 2 3 class ApplicationController lt ActionController Base Prevent CSRF attacks by r
  • Application.Exit() 不起作用

    static void Main Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application Exit App
  • PyMongo 与 Django 的 MongoEngine

    对于我的一个项目 我更喜欢使用Django Mongodb 我为什么要使用蒙戈引擎 但不仅仅是PyMongo 有什么优点 使用 PyMongo 查询给出的结果是已准备好的对象 不是吗 那么 MongoEngine 的目的是什么 这是一个老问
  • 在 Terraform 中使用“execute”插值声明变量

    我想将一个变量的子字符串声明给另一个变量 我测试了使用 terraform 控制台获取子字符串 gt echo element split 10 250 3 0 24 2 terraform console gt 3 我的子网是 10 25
  • 更改树莓派蓝牙设备名称?

    我正在尝试将树莓派的蓝牙名称更改为其他名称 IP 地址 以便当我扫描并配对我的 Android 设备时 它将将此 IP 视为设备名称 它工作过一次 但随后又返回显示为 raspberrypi 0 我已经尝试了 hciconfig set n
  • Android Lollipop 成为设备管理员不起作用

    我正在跟进本指南 http developer android com guide topics admin device admin html关于如何让我的应用程序请求成为设备管理员 这适用于任何 4 x android 版本的任何手机
  • 为什么构建 liblzma 失败并显示“找不到库”?

    我从他们的网站安装了 mingw 我安装了带有 iconv 和 intl msys 和所有其他东西的开发人员包 I run configure进而make install 链接时 它打印 src liblzma liblzma la lin
  • 从某个节点打开事件查看器

    打开显示特定节点详细信息的 Windows 事件查看器的命令是什么 例如 如果我只是使用eventvwr命令 它会打开选 择根节点的 UI 我想Application打开时选择的节点或任何其他节点 可以通过编程方式配置吗 Thanks 要查
  • 如何在 Flask-SQLAlchemy 中同时设置一对多和一对一关系?

    我试图在 Flask SQLAlchemy 中同时创建一对一和一对多关系 我想实现这个目标 一个群组有许多成员和一名管理员 这是我所做的 class Group db Model id db Column db Integer primar