Python 我如何在SQLAlchemy中正确处理这种多对多关系?获得;“检测到双向属性冲突”;

Python 我如何在SQLAlchemy中正确处理这种多对多关系?获得;“检测到双向属性冲突”;,python,postgresql,sqlalchemy,relational-database,Python,Postgresql,Sqlalchemy,Relational Database,我正在用代码设置数据库,在试图找出如何以我想要的方式处理多对多关系时遇到了困难 基本上,我有一个User类,它有一个带有Team类的m2m。事实上,一个团队有许多用户,一个用户可以是许多团队的一部分。到目前为止一切正常。当我想将“管理员”权限授予团队的用户时,问题就出现了 我尝试使用一个,但我不知道如何标记为管理员的关系。因此,我创建了第二个映射表,将团队映射到用户表中的管理员。如图所示: Base=declarative_Base() #多对多关系映射表 用户团队地图=表格( “用户团队地图”

我正在用代码设置数据库,在试图找出如何以我想要的方式处理多对多关系时遇到了困难

基本上,我有一个
User
类,它有一个带有
Team
类的m2m。事实上,一个团队有许多用户,一个用户可以是许多团队的一部分。到目前为止一切正常。当我想将“管理员”权限授予团队的用户时,问题就出现了

我尝试使用一个,但我不知道如何标记为管理员的关系。因此,我创建了第二个映射表,将团队映射到用户表中的管理员。如图所示:

Base=declarative_Base()
#多对多关系映射表
用户团队地图=表格(
“用户团队地图”,Base.metadata,
列('user\u id',Integer,ForeignKey('users.id'),primary\u key=True),
列('team_id',整数,ForeignKey('teams.id'),primary_key=True)
)
管理团队地图=表格(
“管理团队地图”,Base.metadata,
列('user\u id',Integer,ForeignKey('users.id'),primary\u key=True),
列('team_id',整数,ForeignKey('teams.id'),primary_key=True)
)
类用户(基本):
__tablename_uu='users'
id=列(整数,主键=True)
first_name=Column(字符串(24),nullable=False)
团队=关系('Team',secondary=user\u Team\u map,back\u populates='users')
admin\u of=关系('Team',secondary=admin\u Team\u map,back\u populates='users'))
班队(基地):
__tablename_uuu=‘团队’
id=列(整数,主键=True)
name=Column(字符串(100),null=False)
用户=关系('User',secondary=User\u team\u map,back\u populates='teams')
管理员=关系('User',secondary=admin\u team\u map,back\u populates='teams')
当我尝试创建这些表时,我得到:
ValueError:检测到双向属性冲突:将对象传递给属性“Team.admins”会通过backref“User.teams”触发属性“Team.users”上的修改事件。

我当然不是一个数据库向导,所以我想这是我的整体方法是不正确的。我应该如何着手实现我想要的关系?如果我应该使用关联对象,我将如何执行此操作

资格认证
我不知道
SQLAlchemy
,所以我不能用这些术语回答。我将用
Relational Database
SQL
的术语回答:我相信您可以找到实现方法。我使用的术语只是关系型的

是的,错误消息是有效的,即使错误消息文本对您来说可能不是特定的或指示问题,因为您确实有重复的错误消息(在数据库或ORM中不可接受)。根据限定条件,我不会使用术语“*定向”,因为关系在关系数据库或SQL中没有方向(它们有父项和子项)

这个问题有两个层次,我将按逻辑顺序解释。第一层是数据库存储,第二层是将存储转换为类的问题

1存储 1.1关联表 首先需要了解身体水平。虽然它通常是逻辑设计的结果,但似乎存在一个缺口:您在没有正式考虑逻辑设计的情况下进入了物理

您拥有的是一个关联表
user\u team\u map
。它将
用户
团队
关联,并将n-to-n关系解析为两个0-to-n关系,每个父级一个。(我也不会用
map
这个词。)

  • 我所有的数据模型都在中呈现,这是自1993年以来关系数据库建模的标准
  • 我的主要爱好是阅读
1.2你的,关系化的 然后您需要确定:

每个团队有0到n个管理员
(即
用户

但是您“无法找出如何将关系标记为管理员”,因此您将整个
user\u team\u map
结构复制到
admin\u team\u map

  • 这是一个严重的标准化错误,将在逻辑和物理层面上造成问题。因此,
    SQLAlchemy
    barfs在这里并不奇怪(尽管错误消息文本不是指示性的)。首先,它允许
    用户
    成为
    团队
    中的
    管理员
    ,而不是
    团队
    中的
    用户
我们只需在
user\u team-map
表中将
用户
标记为
管理员
。关联表仅包含对两个父表的引用,向其中添加列将使其脱离关联表类别,进入普通表

  • 零是自杀。它们是由于标准化错误造成的
1.3关系解决方案

  • 注意,这实现了谓词:
    每个团队都有0到n名管理员

    谓词:
    每个团队都有0对1的管理员
  • MemberName和AdminName
    UserName
1.4记录归档系统解决方案(退化和紊乱) 由于“理论家”和“作者”将1960年代的前关系系统推广和营销为“关系”,在“文学”和“教科书”中,存在着许多混乱。产生的RFS不具有完整性;权力或关系系统的速度。在任何情况下,这就是ORMs使用的,这就是您正在使用的,所以我将提供它

如果一个人遵循异教徒的指示,他就会想到这一点,这就是“关系”

  • 不阻止关系模型中禁止的重复行
  • 非利士人喜欢他们重复的
    外键
    引用,以及它可以解决的循环引用问题