【问题标题】:flask restless bulk delete using angularjs or javascript, is that possible?使用angularjs或javascript烧瓶不安的批量删除,这可能吗?
【发布时间】:2018-11-13 00:16:34
【问题描述】:

我想使用 angularjs http 请求对烧瓶 restless api 版本 0.17.0 进行批量删除。 我知道我可以一一做,在 url 中使用记录的 id。但如果这在一个请求中是可能的,我会很高兴。我不确定这是否可能

Flask 后端如下所示:

manager.create_api(Messages,
     methods=['GET','PUT','DELETE'], 
     preprocessors={"GET_MANY": [auth_func],
                    "GET_SINGLE": [auth_func],
                    "PUT_SINGLE":[auth_func],
                    "DELETE_SINGLE":[auth_func],
                    "DELETE_MANY":[auth_func] },
     allow_delete_many=True)

我的 Angularjs 代码如下所示:

$scope.deleteMails = function(){
    //$scope.deleteMessage = [1,2,3] array of id to delete
    var create_filters = []      
    $scope.deleteMessage.forEach(ele => {            
        create_filters.push({"name": "id", "op": "equals", "val": ele.toString()})
    });        
    $http({
        method  : 'DELETE',
        headers: {'X-CSRFToken' : csrf }, 
        url     : '/api/tbl_messages',
        data : { q : {filters: create_filters} }    
    })
    .then(function(res){
        console.log(res)
    },function(res){
        console.log('error')
    })
}

此请求以状态 200 完成,但我在 db 中的整个表已被删除。在所有情况下,它都会删除我的整个数据库(表)而不是具体的 ID。 我真的不知道在这里做什么。非常感谢您提前提供的帮助。

【问题讨论】:

    标签: javascript python angularjs flask flask-restless


    【解决方案1】:

    Flask-restless 希望过滤器在查询字符串中传递——而不是作为数据的一部分。这就是为什么它会删除您的所有数据。它根本没有拿起过滤器。

    一旦问题得到解决,您的过滤器本身就会出现另一个问题。您将其作为过滤器发送:

    [ 
      {'name': 'id', 'op': 'equals', 'val': 1},
      {'name': 'id', 'op': 'equals', 'val': 2}
    ]
    

    仅当所有过滤器都匹配时,Flask-restless 查询才会考虑匹配。换句话说,它用 and 连接它们:

    delete from message where id = 1 and id = 2
    

    你要么需要告诉flask-restless你想要一个“或”

    [
      { "or": [
          {"name": "id", "op": "equals", "val": 1},
          {"name": "id", "op": "equals", "val": 2}
      ] }
    ]
    

    或将您的过滤器运算符更改为“in”:

      [  {"name": "id", "op": "in", "val": [1, 2] } ]
    

    尝试将您的角度代码更改为(注意从数据到参数的更改):

    $http({
        method  : 'DELETE',
        headers: {'X-CSRFToken' : csrf }, 
        url     : '/api/tbl_messages',
        params: { q : JSON.stringify({filters:[{or: create_filters}]}) }    
    })
    

    或者——也许更容易理解——将你的操作符更改为“in”,你就可以摆脱 forEach:

    $http({
        method  : 'DELETE',
        headers: {'X-CSRFToken' : csrf }, 
        url     : '/api/tbl_messages',
        params: { q : JSON.stringify({filters:[{name:'id', op:'in', val: $scope.deleteMessage}]}) }    
    })
    

    【讨论】:

    • 太棒了!!!非常感谢,这确实有效。我没有从文档中破译它:) 谢谢
    猜你喜欢
    • 2014-07-20
    • 1970-01-01
    • 2022-12-15
    • 2012-11-20
    • 2020-12-21
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多