【发布时间】:2020-12-07 00:28:16
【问题描述】:
我使用 SQLAlchemy 在下面的代码中创建了具有单表继承的模型。
我正在尝试创建一对多关系,其中Directory 可以包含许多由Bookmark.id 链接的Bookmarks。
我希望模型允许我执行以下操作:
-
Directory.children或Bookmark.children(仅当Bookmark是Directory时)会给我它包含的Bookmarks。 (无论是Directory还是Url) -
Bookmark.parent、Directory.parent或Url.parent将为我提供Bookmark、Directory或Url的父级Directory
这是我第一次使用单表继承,所以我可能犯了一个愚蠢的错误。
目前我知道以下问题:
-
Directory.children获取父目录。 -
Directory.parent获取子目录,但不包含任何 url。
这是我的代码:
class Bookmark(Base):
__tablename__ = "Bookmark"
id = Column(Integer, primary_key=True)
title = Column(String(256))
date_added = Column(DateTime, nullable=False, default=datetime.utcnow)
position = Column(Integer)
parent_id = Column(Integer, sqlalchemy.ForeignKey("Bookmark.id"))
type = Column(String)
__mapper_args__ = {"polymorphic_on": type, "polymorphic_identity": "bookmark"}
class Url(Bookmark):
url = Column(String(500))
icon = Column(String)
icon_uri = Column(String)
tags = Column(String(500))
__mapper_args__ = {"polymorphic_identity": "url"}
class Directory(Bookmark):
children = relationship(
"Bookmark",
cascade="save-update, merge, delete",
backref="parent",
lazy=False,
remote_side="Bookmark.id",
)
__mapper_args__ = {"polymorphic_identity": "directory"}
编辑:
所以我解决了我的问题的很大一部分,我不知道这是否是最好的方法,但这里就是这样。
- 我将关系名称及其后向引用
children/parent切换为parent/children,如下所示
parent = relationship(
"Bookmark",
cascade="save-update, merge, delete",
backref="children",
lazy=False,
remote_side="Bookmark.id",
)
- 我将关系的位置从
Directory类更改为Bookmark类。
但是现在Url 类也有一个.children 属性。
有没有办法解决这个问题?
【问题讨论】:
标签: python python-3.x database sqlalchemy