在 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 当传递 Decimalndigits 时将 return 传递 Decimal,因此传递 amount=round((order.amount),2) 不会执行您的操作假设它确实如此(转换为 floatint)。此外,将 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")