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年以来关系数据库建模的标准
- 我的主要爱好是阅读
每个团队有0到n个管理员
(即用户
)
但是您“无法找出如何将关系标记为管理员”,因此您将整个user\u team\u map
结构复制到admin\u team\u map
中
- 这是一个严重的标准化错误,将在逻辑和物理层面上造成问题。因此,
barfs在这里并不奇怪(尽管错误消息文本不是指示性的)。首先,它允许SQLAlchemy
成为用户
中的团队
,而不是管理员
中的团队
用户
user\u team-map
表中将用户
标记为管理员
。关联表仅包含对两个父表的引用,向其中添加列将使其脱离关联表类别,进入普通表
- 零是自杀。它们是由于标准化错误造成的
- 注意,这实现了谓词:
每个团队都有0到n名管理员
非谓词:
每个团队都有0对1的管理员
是MemberName和AdminName
UserName
- 不阻止关系模型中禁止的重复行
- 非利士人喜欢他们重复的
引用,以及它可以解决的循环引用问题外键