Python 在单表继承SQLAlchemy模型中创建一对多关系

Python 在单表继承SQLAlchemy模型中创建一对多关系,python,python-3.x,database,sqlalchemy,Python,Python 3.x,Database,Sqlalchemy,在下面的代码中,我使用SQLAlchemy创建了具有单个表继承的模型。 我正在尝试创建一个一对多关系,目录可以包含许多由Bookmark.id链接的书签 我希望模型允许我执行以下操作: Directory.children或Bookmark.children(仅当书签是目录时)将为我提供它包含的书签。(无论是目录还是Url) Bookmark.parent,目录。parent或Url。parent将为我提供书签,目录或Url 这是我第一次使用单表继承,所以我可能犯了一个愚蠢的错误 目前我知道以下

在下面的代码中,我使用SQLAlchemy创建了具有单个表继承的模型。 我正在尝试创建一个一对多关系,
目录
可以包含许多由
Bookmark.id
链接的
书签

我希望模型允许我执行以下操作:

  • Directory.children
    Bookmark.children
    (仅当
    书签
    目录
    时)将为我提供它包含的
    书签。(无论是
    目录
    还是
    Url
  • Bookmark.parent
    目录。parent
    Url。parent
    将为我提供
    书签
    目录
    Url
  • 这是我第一次使用单表继承,所以我可能犯了一个愚蠢的错误

    目前我知道以下问题:

  • Directory.children
    获取父目录的名称
  • Directory.parent
    获取子目录,但不包含任何URL
  • 这是我的代码:

    类书签(基本):
    __tablename_=“书签”
    id=列(整数,主键=True)
    标题=列(字符串(256))
    date\u added=列(DateTime,nullable=False,default=DateTime.utcnow)
    位置=列(整数)
    parent_id=Column(整数,sqlalchemy.ForeignKey(“Bookmark.id”))
    类型=列(字符串)
    __mapper_args_uuuu={“多态性_on”:类型,“多态性_标识”:“书签”}
    类Url(书签):
    url=列(字符串(500))
    图标=列(字符串)
    icon_uri=列(字符串)
    标记=列(字符串(500))
    __mapper_args_uuu={“多态性_标识”:“url”}
    类别目录(书签):
    孩子=关系(
    “书签”,
    cascade=“保存更新、合并、删除”,
    backref=“parent”,
    懒惰=错误,
    remote_side=“Bookmark.id”,
    )
    __映射器参数{“多态标识”:“目录”}
    
    编辑:

    所以我解决了我的大部分问题,我不知道这是否是最好的方法,但现在开始

  • 我将关系的名称及其backref
    children/parent
    切换为
    parent/children
    ,如下所示
  • parent=关系(
    “书签”,
    cascade=“保存更新、合并、删除”,
    backref=“children”,
    懒惰=错误,
    remote_side=“Bookmark.id”,
    )
    
  • 我将关系的位置从
    目录
    类更改为
    书签
  • 但是现在
    Url
    类也有一个
    .children
    属性。
    有没有办法解决这个问题?

    我通过以下步骤解决了大部分问题:

  • 我将关系的名称及其backref
    children/parent
    切换为
    parent/children
    ,如下所示
  • parent=关系(
    “书签”,
    cascade=“保存更新、合并、删除”,
    backref=“children”,
    懒惰=错误,
    remote_side=“Bookmark.id”,
    )
    
  • 我将关系的位置从
    目录
    类更改为
    书签
  • 但是现在
    Url
    类也有一个
    .children
    属性。(这是我不想要的) 也许会有更好的解决方案,但现在我不得不这么做