Sqlalchemy 如何删除uselist=True的多对多关联

Sqlalchemy 如何删除uselist=True的多对多关联,sqlalchemy,flask-sqlalchemy,Sqlalchemy,Flask Sqlalchemy,在我的应用程序中,父实例与子实例共享一对多关系。每个家长可能有许多孩子,但每个孩子可能只有一个家长。我理解这种关系是如何运作的 一个重要的特点是,在任何时候,父母的孩子中只有一个可能是活跃的。起初,我试图通过在子模型上使用布尔值来表示这一点,但强制执行约束太困难了。相反,我选择使用一个关联表,该表只记录在给定时间哪些孩子处于活动状态 下面是由dbdiagram.io生成的一个示例 为了表示这种关系,我使用了uselist=True标志,它告诉SQLAlchemy在通过关系进行查询时返回单个实例而

在我的应用程序中,父实例与子实例共享一对多关系。每个家长可能有许多孩子,但每个孩子可能只有一个家长。我理解这种关系是如何运作的

一个重要的特点是,在任何时候,父母的孩子中只有一个可能是活跃的。起初,我试图通过在子模型上使用布尔值来表示这一点,但强制执行约束太困难了。相反,我选择使用一个关联表,该表只记录在给定时间哪些孩子处于活动状态

下面是由dbdiagram.io生成的一个示例

为了表示这种关系,我使用了
uselist=True
标志,它告诉SQLAlchemy在通过关系进行查询时返回单个实例而不是列表

p1 = Parent()
p1.children = [Child() for i in range(3)]
p1.active_child = p1.children[0]

print(p1.children)      # [Child<1>, Child<2>, Child<3>]
print(p1.active_child)  # Child<1>

p1.active_child = p1.children[1]
session.commit()

print(p1.children)      # [Child<1>, Child<2>, Child<3>]
print(p1.active_child)  # Child<2>

p1.active_child = None
session.commit()

print(p1.children)      # [Child<1>, Child<2>, Child<3>]
print(p1.active_child)  # None
我需要能够删除这些关系,从而停用子项,而不删除父项或子项。我尝试过使用
session.delete(parent.active\u child)
,但这会删除子记录,而不仅仅是关联。我看到有,但这假设关系查询返回一个列表,从而允许开发人员使用
association.remove(instance)
。我的情况并非如此

请参见下面的示例。请注意父模型上的这两种关系

children\u active=表('children\u active',Base.metadata,
列('parent_id',Integer,ForeignKey('parents.id'),primary_key=True,unique=True),
列('child_id',Integer,ForeignKey('children.id'),primary_key=True)
)
类父(基):
__tablename_uuu='parents'
id=列(整数,主键=True)
children=关系(“Child”,backref='parent')
活动\u子项=关系(“子项”,次要=子项\u活动,使用列表=假)
类子(基):
__tablename_uuu='children'
id=列(整数,主键=True)
parent_id=列(整数,ForeignKey('parents.id'))
p1=Parent()
p1.children=[Child()表示范围(3)中的i]
p1.active_child=p1.children[0]
打印(p1.儿童)#[儿童,儿童,儿童]
打印(p1.活动子项)#子项
会话.删除(p1.活动\U子级)
打印(p1.儿童)#[儿童,儿童]
打印(p1.活动子项)#无

active\u child
被清空,这是正确的,但它表示的子对象也被删除,这是不可接受的。

我发现了这一点。重新指定
active\u child
值将覆盖关系,并使
子对象保持不变。将
active\u child
设置为
None
将删除该关系

p1 = Parent()
p1.children = [Child() for i in range(3)]
p1.active_child = p1.children[0]

print(p1.children)      # [Child<1>, Child<2>, Child<3>]
print(p1.active_child)  # Child<1>

p1.active_child = p1.children[1]
session.commit()

print(p1.children)      # [Child<1>, Child<2>, Child<3>]
print(p1.active_child)  # Child<2>

p1.active_child = None
session.commit()

print(p1.children)      # [Child<1>, Child<2>, Child<3>]
print(p1.active_child)  # None
p1=Parent()
p1.children=[Child()表示范围(3)中的i]
p1.active_child=p1.children[0]
打印(p1.儿童)#[儿童,儿童,儿童]
打印(p1.活动子项)#子项
p1.active_child=p1.children[1]
session.commit()
打印(p1.儿童)#[儿童,儿童,儿童]
打印(p1.活动子项)#子项
p1.active_child=无
session.commit()
打印(p1.儿童)#[儿童,儿童,儿童]
打印(p1.活动子项)#无