postman 语句错误:(内置.TypeError)不是布尔值:'错误'

vfh0ocws  于 2022-11-07  发布在  Postman
关注(0)|答案(2)|浏览(270)

我希望将OnlineAvailability的默认值设置为True。默认情况下,所有医生都将具有所有可用的时间段计时。
如果我在PostmanPOST中给予JSON主体数据,则数据:
http://127.0.0.1:8000/online

{
    "OnlineTimeSlot": "18:30"
}

在这里,OnlineAvailability默认设置为true,我得到以下消息:

{
    "message": "New Time Slot, 18:30 added!"
}

当我GET数据时,它显示:
http://127.0.0.1:8000/online/16

{
    "OnlineScheduleId": 16,
    "OnlineTimeSlot": "18:30",
    "OnlineAvailability": true
}

但是,如果我想将OnlineAvailability指定为falsePOST数据 * 或 * 如果我想使用Postman JSON主体中的PUT方法更新现有的计时数据:
http://127.0.0.1:8000/online

{
    "OnlineTimeSlot": "18:30",
    "OnlineAvailability": false
}

然后,我收到错误:
sqlalchemy.exc.StatementError:(内置.TypeError)不是布尔值:'False' [SQL:INSERT INTO“在线日程”(“在线时间槽”,“在线可用性”)VALUES(?,?)] [参数:[{'在线时间槽':“18:30”,“联机可用性”:'False'}]]//工件调试器
如何将默认值从true更改为false,或在OnlineAvailability为false的情况下上传新的Time Slot而不出现上述错误?(该值应被识别为布尔值而不是字符串)

  • 在线.py --〉模型 *

# omitted code

class OnlineScheduleModel(db.Model):

    # omitted code

    OnlineTimeSlot = db.Column(db.String(500), unique=True, nullable=False)
    OnlineAvailability = db.Column(db.Boolean, nullable=False, default=True, server_default="true")

    def __init__(self, OnlineTimeSlot, OnlineAvailability):
        self.OnlineTimeSlot = OnlineTimeSlot
        self.OnlineAvailability = OnlineAvailability

    def json(self):
        return {"OnlineScheduleId": self.OnlineScheduleId, "OnlineTimeSlot": self.OnlineTimeSlot, "OnlineAvailability": self.OnlineAvailability}

# ommitted code
  • online.py --〉资源 *

# omitted code

class OnlineScheduleInfo(Resource):

    parser = reqparse.RequestParser()

    parser.add_argument("OnlineTimeSlot", required=True)
    parser.add_argument("OnlineAvailability", required=False)

    # omitted code
    @cross_origin(supports_credentials=True)
    def post(self):
        data = OnlineScheduleInfo.parser.parse_args()
        schedule = OnlineScheduleModel(**data)
        if OnlineScheduleModel.find_by_timeslot(data['OnlineTimeSlot']):
            return {"message": "A timeslot '{}' already exists".format(data['OnlineTimeSlot'])}, 400
        # omitted code

        schedule.save_to_db()

        # omitted code

        return {"message": "New Time Slot, {} added!".format(data['OnlineTimeSlot'])}, 200

    @cross_origin(supports_credentials=True)
    def put(self):
        data = OnlineScheduleInfo.parser.parse_args()
        schedule = OnlineScheduleModel.find_by_timeslot(data['OnlineTimeSlot'])
        if schedule is None:
            schedule = OnlineScheduleModel(**data)
        else:
            schedule.OnlineAvailability = data["OnlineAvailability"]
        schedule.save_to_db()
        return {"message": "schedule, {} Updated!".format(data['OnlineTimeSlot'])}, 200

基本上,我的要求是,我应该能够POSTPUT数据,OnlineAvailability为false,并且我应该在Postman中获得GET的输出:
http://127.0.0.1:8000/online/16

{
    "OnlineScheduleId": 16,
    "OnlineTimeSlot": "18:00",
    "OnlineAvailability": false
}
velaa5lx

velaa5lx1#

只是nstvnsn提到的代码中的一个小变化,不再维护Flask-RESTPlus。
因此,我们可以改用flask_restx。

from flask_restx import inputs

parser.add_argument("OnlineAvailability", required=False, type=inputs.boolean)
jljoyd4f

jljoyd4f2#

当你向解析器添加参数时,你可以省略简单基元类型的类型参数。对于boolean,你可能需要声明它以进行更广泛的布尔处理。不同的数据库处理布尔值的方式不同。
如果你看一下sqlite3的文档,它是你的应用程序正在使用的引擎,它存储的布尔值为0表示false,1表示true。解析器需要知道添加的参数是一个布尔值,这样它才能解析python原生的布尔类型。

from flask_restplus import inputs

parser.add_argument('OnlineAvailability', required=False, type=inputs.boolean)

为了证实这一点,我用你提供的代码黑进了一个应用程序,重现了这个问题:

我在parser.add_argument函数调用中添加了type参数,并且通过cURL的相同post请求可以工作:

另外,查看Flask_restplus.reqparse.RequestParser的文档(2.0以后被认为是不推荐使用的,他们的文档提到它被替换为更好的替代品,如棉花糖):
警告
Flask-RESTPlus的整个请求解析器部分将被删除,并将被关于如何与其他更好地处理输入/输出的包(如marshmallow)集成的文档所取代。这意味着它将被保留到2.0,但认为它已过时。不要担心,如果您现在有使用它的代码并希望继续这样做,它不会很快消失。
https://flask-restplus.readthedocs.io/en/stable/parsing.html

相关问题