【问题标题】:Python Flask-Restful Error: Delete method in API is deleting ALL database entriesPython Flask-Restful 错误:API 中的删除方法正在删除所有数据库条目
【发布时间】:2019-09-13 03:59:02
【问题描述】:

我编写了一个烧瓶-restful 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 的片段。

【问题讨论】:

  • 尝试使用不同的变量名而不是Piece (Piece = models.Piece.select().where(models.Piece.id==id).get()),我认为是为什么当你这样做时所有东西都会被删除Piece.delete()
  • 我将变量更改为piece_to_delete,并更改了查询变量以反映这一点。我遇到了同样的问题:(。

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


【解决方案1】:

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

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

1 将调用更改为 delete 以添加与选择匹配的位置。

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

【讨论】:

  • 我想我跳过了文档的那一部分..感谢您指出!我首先尝试了第二个选项,但它不起作用。第一个选项确实有效,非常感谢您!
猜你喜欢
  • 2019-08-12
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
相关资源
最近更新 更多