我是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,我不知道该怎么做。
我确定之前已经回答过,或者在某个地方的简单教程中进行了解释,但我还没有找到足够简单的东西让我理解。我希望有人可以带我了解基础知识。 (哪些部分应该是神奇的,哪些部分我还需要手动编码......)
感谢。
答案 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()
瞧,你的项目和子项目都应该立即插入到数据库中。