Flask Sqlalchemy 添加多行

3

我正在使用 Flask-RESTful,这是我的类,我想要插入。

class OrderHistoryResource(Resource):

    model = OrderHistoryModel
    schema = OrderHistorySchema
    order = OrderModel
    product = ProductModel

    def post(self):
        value = req.get_json()
        data = cls.schema(many=True).load(value)  
        data.insert()

在我的模型中。
def insert(self):
    db.session.add(self)
    db.session.commit()

模式(schema)
from config.ma import ma
from model.orderhistory import OrderHistoryModel

class OrderHistorySchema(ma.ModelSchema):
    class Meta:
        model = OrderHistoryModel
        include_fk = True

我要插入的示例数据

[
    {
        "quantity":99,
        "flaskSaleStatus":true,
        "orderId":"ORDER_64a79028d1704406b6bb83b84ad8c02a_1568776516",
        "proId":"PROD_9_1568779885_64a79028d1704406b6bb83b84ad8c02a"
     },
     {
        "quantity":89,
        "flaskSaleStatus":true,
        "orderId":"ORDER_64a79028d1704406b6bb83b84ad8c02a_1568776516",
        "proId":"PROD_9_1568779885_64a79028d1704406b6bb83b84ad8c02a"
     }
]

插入方法开始后,我获得了以下结果

TypeError: insert() takes exactly 2 arguments (0 given)

还有其他方法可以执行这个操作吗?


你的代码中似乎有一些奇怪的特性。你不需要将post定义为类方法,而且在该方法内部,你已经在函数定义中传递了self,但是使用cls来访问模式,这似乎应该会出错。我看不到代码的其余部分,但假设OrderHistorySchema只是一个marshmallow模式?这意味着data不是你的模型实例,因此可能是不同的insert方法?请展示模型和模式类。 - elembie
抱歉问题没有表述清楚,这是因为我在模型中的插入方法开始时将 "schema()" 改为了 "schema(many=True)",似乎没有看到任何参数。 - 21bn
2个回答

9

编辑-发布marshmallow-sqlalchemy直接加载到实例

您需要遍历列表中的OrderModel实例。

然后,您可以使用add_allOrderModel对象添加到会话中,然后进行批量更新-请参见文档

应该是这样的:

db.session.add_all(data)
db.session.commit() 

参见这篇帖子,简要讨论了为什么在存在复杂ORM关系时add_all最好。

此外,不确定您是否需要将所有模型/模式作为类变量,将它们导入(或只需在资源类之前声明它们,只要它们在同一个文件中即可)也可以。


0

你正在调用列表上的insert,因为dataOrderHistoryModel实例模型的列表。

此外,post方法不需要是classmethod,你可能在那里也有一个错误。

由于data是模型实例的列表,因此可以使用db.session.add_all方法批量将它们添加到会话中。

    def post(self):
        value = req.get_json()
        data = self.schema(many=True).load(value)
        db.session.add_all(data)
        db.session.commit() 

谢谢,但我不想在插入之前循环它们。 - 21bn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接