在 Django 中发出 post 请求时如何传递小数值?
How to pass a decimal value when making a post request in django?
我正在尝试向第三方应用程序发出 post 请求以及一些数据,这些数据也有最多两点的十进制值,这是我从数据库中获取的 (order.amount) 但是在发出请求后得到错误说数据不能序列化到 json 然后我将它作为 '"%s"' % round(order.amount,2) 传递然后也得到错误 post 数据 empty.Looking 用于解决此问题的建议。
request = Transfer.request_transfer(beneId=beneficiary_id, amount=round((order.amount),2)
transferId=transfer_identifier,remarks="Test transfer")
getting error: decimal is not json serializable
print('"%s"' % round((order.amount),2) #"5000.23"
request = Transfer.request_transfer(beneId=beneficiary_id, amount='"%s"' % round((order.amount),2) transferId=transfer_identifier,remarks="Test transfer")
getting error : PreconditionFailedError: Reason = Post data is empty or not a valid JSON:: response = {"status": "ERROR", "subCode": "412", "message": "Post data is empty or not a valid JSON"}
but when hardcoding amount then it is working
request = Transfer.request_transfer(beneId=beneficiary_id, amount= "5000.23" transferId=transfer_identifier,remarks="Test transfer")
round
函数根据Python docs:
The return value is an integer if ndigits is omitted or None
.
Otherwise the return value has the same type as number.
因此 round
当传递 Decimal
和 ndigits
时将 return 传递 Decimal
,因此传递 amount=round((order.amount),2)
不会执行您的操作假设它确实如此(转换为 float
或 int
)。此外,将 Decimal
转换为 float
意味着我们 不想 想要的精度损失(我们将使用 Decimal
的全部原因)。要传递 Decimal
值,只需将其作为 string 传递(这当然意味着我们需要执行一些类型转换在客户端,如果我们想使用它执行算术):
request = Transfer.request_transfer(
beneId=beneficiary_id,
amount=str(order.amount),
transferId=transfer_identifier,
remarks="Test transfer"
)
注意这一行,
print('"%s"' % round((order.amount),2) #"5000.23"
我猜你错过了一件事:你正在格式化你的十进制值,但是你用引号来做到这一点,所以你的变量 amount
将包含 "5000.23"
字符串而不是 5000.23
.
所以,看:
request = Transfer.request_transfer(beneId=beneficiary_id, amount='"%s"' % round((order.amount),2) transferId=transfer_identifier,remarks="Test transfer")
你有 amount='"5000.23"'
并且这些引用妨碍了序列化。
要修复它,只需删除额外的引号:
print('%s' % round((order.amount),2) # '5000.23'
request = Transfer.request_transfer(beneId=beneficiary_id, amount='%s' % round((order.amount),2) transferId=transfer_identifier,remarks="Test transfer")
我正在尝试向第三方应用程序发出 post 请求以及一些数据,这些数据也有最多两点的十进制值,这是我从数据库中获取的 (order.amount) 但是在发出请求后得到错误说数据不能序列化到 json 然后我将它作为 '"%s"' % round(order.amount,2) 传递然后也得到错误 post 数据 empty.Looking 用于解决此问题的建议。
request = Transfer.request_transfer(beneId=beneficiary_id, amount=round((order.amount),2)
transferId=transfer_identifier,remarks="Test transfer")
getting error: decimal is not json serializable
print('"%s"' % round((order.amount),2) #"5000.23"
request = Transfer.request_transfer(beneId=beneficiary_id, amount='"%s"' % round((order.amount),2) transferId=transfer_identifier,remarks="Test transfer")
getting error : PreconditionFailedError: Reason = Post data is empty or not a valid JSON:: response = {"status": "ERROR", "subCode": "412", "message": "Post data is empty or not a valid JSON"}
but when hardcoding amount then it is working
request = Transfer.request_transfer(beneId=beneficiary_id, amount= "5000.23" transferId=transfer_identifier,remarks="Test transfer")
round
函数根据Python docs:
The return value is an integer if ndigits is omitted or
None
. Otherwise the return value has the same type as number.
因此 round
当传递 Decimal
和 ndigits
时将 return 传递 Decimal
,因此传递 amount=round((order.amount),2)
不会执行您的操作假设它确实如此(转换为 float
或 int
)。此外,将 Decimal
转换为 float
意味着我们 不想 想要的精度损失(我们将使用 Decimal
的全部原因)。要传递 Decimal
值,只需将其作为 string 传递(这当然意味着我们需要执行一些类型转换在客户端,如果我们想使用它执行算术):
request = Transfer.request_transfer(
beneId=beneficiary_id,
amount=str(order.amount),
transferId=transfer_identifier,
remarks="Test transfer"
)
注意这一行,
print('"%s"' % round((order.amount),2) #"5000.23"
我猜你错过了一件事:你正在格式化你的十进制值,但是你用引号来做到这一点,所以你的变量 amount
将包含 "5000.23"
字符串而不是 5000.23
.
所以,看:
request = Transfer.request_transfer(beneId=beneficiary_id, amount='"%s"' % round((order.amount),2) transferId=transfer_identifier,remarks="Test transfer")
你有 amount='"5000.23"'
并且这些引用妨碍了序列化。
要修复它,只需删除额外的引号:
print('%s' % round((order.amount),2) # '5000.23'
request = Transfer.request_transfer(beneId=beneficiary_id, amount='%s' % round((order.amount),2) transferId=transfer_identifier,remarks="Test transfer")