javascript - 使用 angularjs 或 javascript 的 flask reSTLess 批量删除,这可能吗?

标签 javascript python angularjs flask flask-restless

我想使用 angularjs http 请求对 flask 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,但我在数据库中的整个表已删除。在所有情况下,它都会删除我的整个数据库(表)而不是具体的 ID。 我真的不知道在这里做什么。非常感谢您的提前帮助。

最佳答案

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] } ]

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

$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}]}) }    
})

关于javascript - 使用 angularjs 或 javascript 的 flask reSTLess 批量删除,这可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50667409/

相关文章:

javascript - 无论如何要将 ng-click 添加到 md-backdrop?

angularjs - Angular +选择: selected values

javascript - Mongodb在数组查询中不会得到任何结果

javascript - 循环引用内存泄漏?

python - 启动pypi-server时出现"malformed htpasswd file"错误消息

php - 简单的 CGI python 网络服务器 + php 不工作

javascript - ionic 滚动有白色覆盖层滞后

javascript - dust.js 模板中的变量和存储/比较值

javascript - 尝试从在线 api.fixer.io 获取 json

python - 维护一个固定大小的堆-python