我希望将OnlineAvailability的默认值设置为True。默认情况下,所有医生都将具有所有可用的时间段计时。
如果我在Postman和POST中给予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指定为false
并POST数据 * 或 * 如果我想使用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
基本上,我的要求是,我应该能够POST或PUT数据,OnlineAvailability为false
,并且我应该在Postman中获得GET的输出:
http://127.0.0.1:8000/online/16
{
"OnlineScheduleId": 16,
"OnlineTimeSlot": "18:00",
"OnlineAvailability": false
}
2条答案
按热度按时间velaa5lx1#
只是nstvnsn提到的代码中的一个小变化,不再维护Flask-RESTPlus。
因此,我们可以改用flask_restx。
jljoyd4f2#
当你向解析器添加参数时,你可以省略简单基元类型的类型参数。对于boolean,你可能需要声明它以进行更广泛的布尔处理。不同的数据库处理布尔值的方式不同。
如果你看一下sqlite3的文档,它是你的应用程序正在使用的引擎,它存储的布尔值为0表示false,1表示true。解析器需要知道添加的参数是一个布尔值,这样它才能解析python原生的布尔类型。
为了证实这一点,我用你提供的代码黑进了一个应用程序,重现了这个问题:
我在
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