колбу беспокойное массовое удаление с помощью angularjs или javascript, это возможно? - PullRequest
0 голосов
/ 03 июня 2018

Я хочу выполнить массовое удаление, используя http-запрос angularjs, чтобы установить флаги restless api версии 0.17.0.Я знаю, что могу сделать это один за другим, используя id записи в 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.log(res)
    },function(res){
        console.log('error')
    })
}

Этот запрос завершен сстатус 200 но вся моя таблица в дб удалена.Во всех случаях это удаление всей моей БД (таблицы), а не конкретных идентификаторов.Я действительно не знаю, что здесь делать.Заранее большое спасибо за помощь.

1 Ответ

0 голосов
/ 03 июня 2018

Flask-restless хочет, чтобы фильтр был передан в строке запроса, а не как часть данных.Вот почему он удаляет все ваши данные.Это не захват фильтра вообще.

Как только это исправлено, у вас есть дополнительная проблема в самом фильтре.Вы отправляете это в качестве фильтра:

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

Запрос, не вызывающий проблем с колбами, считает что-то совпадением, только если все фильтры совпадают.Другими словами, он объединяет их всех с помощью и:

delete from message where id = 1 and id = 2

Вам нужно будет либо указать флакону, что вам нужен 'или'

[
  { "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}]}) }    
})
...