Я хочу выполнить массовое удаление с помощью http-запроса angularjs, чтобы запустить беспокойный api версии 0.17.0. Я знаю, что могу делать это по одному, используя идентификатор записи в URL-адресе. Но я был бы рад, если это возможно в одном запросе. Я не уверен, возможно ли это
Бэкэнд 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.info(res)
},function(res){
console.info('error')
})
}
Этот запрос завершен со статусом 200, но вся моя таблица в db удалена. Во всех случаях он удаляет всю мою БД (таблицу), а не конкретные идентификаторы. Я действительно не знаю, что здесь делать. Заранее большое спасибо за помощь.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Flask-restless хочет, чтобы фильтр передавался в строке запроса, а не как часть данных. Вот почему он удаляет все ваши данные. Это вообще не подбирает фильтр.
Как только это будет исправлено, у вас возникнет дополнительная проблема в самом фильтре. Вы отправляете это как свой фильтр:
[
{'name': 'id', 'op': 'equals', 'val': 1},
{'name': 'id', 'op': 'equals', 'val': 2}
]
Неугомонный запрос Flask считает что-то совпадающим, только если совпадают все фильтры. Другими словами, он объединяет их все с помощью и:
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}]}) }
})
Удивительный!!! Большое спасибо, это действительно работает. По документации не расшифровывал :) Спасибо