【问题标题】:Saving complex objects in SQLAlchemy在 SQLAlchemy 中保存复杂对象
【发布时间】:2018-04-17 07:27:09
【问题描述】:

我是 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 会自动执行多少操作。我通过创建一个没有sub_itemsitem,创建sub_items,然后用sub_items 重新保存item,得到了一些工作。但这似乎很笨拙,尤其是在item 或某些sub_items 可能已经存在的情况下。

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

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

session.add(self)
session.commit()

但它不起作用(我收到关于不可散列类型的错误),而且它似乎......太简单了,不知何故。就像我应该单独定义 sub_item 对象一样。但由于它们依赖于 item_id,我不知道该怎么做。

我确信这个问题之前已经回答过,或者在某个简单的教程中解释过,但是我找不到足够简单的东西让我理解。我希望有人可以引导我了解基础知识。 (哪些部分应该是神奇的,哪些部分我仍然需要手动编码......)

谢谢。

【问题讨论】:

    标签: python sqlalchemy flask-sqlalchemy flask-restful


    【解决方案1】:

    任何 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()
    

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

    【讨论】:

      猜你喜欢
      • 2015-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-29
      • 2012-03-25
      • 2017-09-09
      相关资源
      最近更新 更多