在SQLAlchemy中保存复杂对象

时间:2018-04-11 21:44:03

标签: python sqlalchemy flask-sqlalchemy flask-restful

我是SQLAlchemy的新手,我尝试使用Flask-RESTful和Flask-SQLAlchemy创建一个包含多个子项列表(简单的一对多关系)的新项目。我试图同时创建项目和子项目,我不清楚SQLAlchemy应该如何工作。

class ItemModel(Model):
    __tablename__ = 'items'

    id = Column(Integer, primary_key=True)
    name = Column(String(80))
    sub_items = relationship('SubItemModel')

class SubItemModel(db.Model):
    __tablename__ = 'sub_items'

    id = Column(Integer, primary_key=True)
    item_id = Column(Integer, ForeignKey('items.id'))
    name = Column(String(80))
    item = relationship('ItemModel')

我想添加一个item和几个sub_items(通过POST路由),但我无法绕过哪些对象创建第一个以及SQLAlchemy将会有多少自动做。我通过创建item而没有sub_items,创建sub_items,然后使用item重新保存sub_items来获得一些工作。但这似乎很笨重,特别是在item或部分sub_items可能已经存在的情况下。

我的直觉就是做这样的事情:

item = ItemModel(
    name="item1",
    sub_items=[{name: "subitem1"},{name: "subitem2"}])

session.add(self)
session.commit()

但是它不起作用(我收到关于不可用类型的错误),而且看起来......太简单了,不知怎的。就像我应该分别定义sub_item个对象一样。但由于他们依赖于item_id,我不知道该怎么做。

我确定之前已经回答过,或者在某个地方的简单教程中进行了解释,但我还没有找到足够简单的东西让我理解。我希望有人可以带我了解基础知识。 (哪些部分应该是神奇的,哪些部分我还需要手动编码......)

感谢。

1 个答案:

答案 0 :(得分:2)

"很多"任何SQLAlchemy关系的一面都像标准的Python列表。您应直接创建SubItemModel个对象,并将其附加到ItemModel

item = ItemModel(name='item1')
subitem1 = SubItemModel(name='subitem1')
subitem2 = SubItemModel(name='subitem2')
item.sub_items.append(subitem1)
item.sub_items.append(subitem2)

或者,要一次附加多个项目,您可以使用标准列表extend方法:

item = ItemModel(name='item1')
subitem1 = SubItemModel(name='subitem1')
subitem2 = SubItemModel(name='subitem2')
item.sub_items.extend([subitem1, subitem2])

如果您愿意,可以在添加子项目时直接创建子项目:

item = ItemModel(name='item1')
item.sub_items.extend([SubItemModel(name='subitem1'), SubItemModel(name='subitem2')])

无论您选择哪个选项,都应该将创建的item对象添加到会话中,该会话将自动包含您已创建的新子记录:

session.add(item)
session.commit()

瞧,你的项目和子项目都应该立即插入到数据库中。