Flask Sqlalchemy добавить несколько строк - PullRequest
0 голосов
/ 19 сентября 2019

Я использую колбу-отдых. Это мой класс, который я хочу вставить

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

схема

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)

или есть другой способ выполнить это действие?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

Отредактировано - выпущенный зефир-sqlalchemy загружается непосредственно в экземпляр

Вам необходимо пройтись по OrderModel экземплярам в вашем списке.

Затем вы можете использовать add_all чтобы добавить OrderModel объекты в сеанс, затем массовое обновление - см. документы

Должно быть что-то вроде:

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

См. этот пост для краткого обсуждения того, почему add_all лучше всего, когда у вас сложные отношения ORM.

Кроме того - не уверен, что вам нужно, чтобы все ваши модели / схемы были переменными класса, хорошо иметь ихимпортированы (или просто представлены в том же файле, если они объявлены перед классом ресурсов).

0 голосов
/ 19 сентября 2019

Вы вызываете insert в списке, потому что data - это список моделей OrderHistoryModel экземпляров.

Также 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() 
...