Python Flask-Restful错误:API中的Delete方法正在删除所有数据库条目

时间:2019-04-23 22:18:34

标签: python sqlite flask flask-restful flask-peewee

我写了一个烧瓶式的API,以及一个带有peewee的SQLite数据库。我可以在要存储其数据的艺术品清单上“获取”。我也能够“获得”单件,“发布”和“放置”而没有问题。但是,如果我要删除单个片段,则我的API会删除所有片段条目。现在,我只是使用邮递员测试我的API,所以我知道这不是AJAX或javascript错误(我将在以后编写)。任何指导可能会有所帮助。

我试图增加发出删除请求所需的查询数量,其中我数据库中的created_by字段(整数ID)必须与进行身份验证的用户的ID相匹配。我创建了两个用户,并分别发布了两个不同的作品,并且对一个作品运行删除请求仍然删除了所有作品。

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')}

如果我的ID为1、2和3的作品,则在url.com/api/v1/pieces/1上运行有效的删除请求,则应该只删除ID为1的作品。

1 个答案:

答案 0 :(得分:1)

问题是您在实例上使用表级方法delete()。您还可以使用行级方法delete_instance()。参见:http://docs.peewee-orm.com/en/latest/peewee/api.html#Model

关于如何解决此问题,您有两种选择:

1将呼叫更改为删除,以添加与所选内容匹配的位置。

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

请参见http://docs.peewee-orm.com/en/latest/peewee/api.html#Model.delete (请注意警告!)

2在对象实例上使用delete_instance()方法:

Piece.delete_instance()

请参见http://docs.peewee-orm.com/en/latest/peewee/api.html#Model.delete_instance