Python Flask-Restful Ошибка: метод удаления в API удаляет ВСЕ записи базы данных - PullRequest
1 голос
/ 24 апреля 2019

Я написал API-интерфейс для колбы и базу данных SQLite с peewee. Я могу «попасть» в мой список произведений искусства, для которых я храню данные. Я также могу «получать» отдельные фрагменты, «постить» и «ставить» без проблем. Однако, если я хочу удалить одну часть, мой API удаляет ВСЕ записи частей. Прямо сейчас я просто тестирую свой API, используя почтальон, поэтому я знаю, что это не ошибка AJAX или javascript (о которой я напишу позже). Любое руководство может быть полезным.

Я попытался увеличить количество запросов, необходимых для создания запроса на удаление, где поле create_by в моей базе данных (которое является целочисленным идентификатором) должно совпадать с идентификатором аутентификации пользователя. Я создал двух пользователей и разместил по два разных фрагмента каждый, и выполняя запрос на удаление фрагмента, все еще удалил все фрагменты.

def piece_or_404(id):
    try:
        piece = models.Piece.get(models.Piece.id==id)
    except models.Piece.DoesNotExist:
        abort(404)
    else:
        return piece
class Piece(Resource):
    def __init__(self):
        self.reqparse = reqparse.RequestParser()
        self.reqparse.add_argument(
            'title',
            required=True,
            help='No title provided',
            location=['form', 'json']
        )
        self.reqparse.add_argument(
            'location',
            required=True,
            help='No url provided',
            location=['form', 'json']
        )
        self.reqparse.add_argument(
            'description',
            required=False,
            nullable=True,
            location=['form', 'json'],
        )
        self.reqparse.add_argument(
            'created',
            type=inputs.date,
            required=False,
            help='Date not in YYYY-mm-dd format',
            location=['form', 'json']
        )
        self.reqparse.add_argument(
            'price',
            type=inputs.positive,
            required=True,
            help='No price provided',
            location=['form', 'json']
        )
        self.reqparse.add_argument(
            'created_by',
            type=inputs.positive,
            required=True,
            help='No user provided',
            location=['form', 'json']
        )
        super().__init__()

    @auth.login_required
    def delete(self, id):
        try:
            Piece = models.Piece.select().where(
                models.Piece.id==id
            ).get()
        except models.Piece.DoesNotExist:
            return make_response(json.dumps(
                    {'error': 'That Piece does not exist or is not editable'}
                ), 403)
        query = Piece.delete()
        query.execute()
        return '', 204, {'Location': url_for('resources.pieces.pieces')}

Если у меня есть фрагменты с идентификаторами 1, 2 и 3, то при выполнении действительного запроса на удаление на url.com/api/v1/pieces/1 следует удалить только фрагмент с идентификатором 1.

1 Ответ

1 голос
/ 24 апреля 2019

Проблема в том, что вы используете метод уровня таблицы delete() в экземпляре. Существует также метод уровня строки delete_instance(), который вы можете использовать. См .: http://docs.peewee -orm.com / ru / latest / peewee / api.html # Модель

У вас есть два варианта решения этой проблемы:

1 Измените свой вызов на удаление, чтобы добавить местоположение, соответствующее выбранному.

query = models.Piece.delete().where(models.Piece.id==id)
query.execute()

См. http://docs.peewee -orm.com / ru / latest / peewee / api.html # Model.delete (Обратите внимание на предупреждение!)

2 Используйте метод delete_instance() для экземпляра объекта:

Piece.delete_instance()

См. http://docs.peewee -orm.com / ru / latest / peewee / api.html # Model.delete_instance

...