Django:HTTP 状态 400 响应回滚模型保存?

Django: HTTP status 400 response rolls back model save?

我有一个 API 端点来触发对第三方的支付请求。使用 POST 请求中的一些数据调用端点,并类似于下面的代码。 不知何故,当支付请求失败时(payment.is_successful = False),没有数据被保存到数据库中,尽管调试日志显示正在进行 SQL 插入,并且没有抛出任何错误。数据只是悄无声息地下降了。

我没有将数据库设置为使用 ATOMIC_REQUESTS(我正在使用 postgreSQL)。我正在使用 django 1.11.5 和 DRF 3.6.3。

我认为如果我将 HTTP_400_BAD_REQUEST 更改为 HTTP_200_OK,那么我的数据就会被保存。

查看代码

ser = MySerializer(data=request.data)
if ser.is_valid():
    payment = ser.save()
else:
    # do some non database stuff
    return Response(result, status=status.HTTP_400_BAD_REQUEST)

if payment.is_successful:
    # some more processing
    return Response({'success': True}, status=status.HTTP_201_CREATED)
else:
    return Response({'success': False}, status=status.HTTP_400_BAD_REQUEST)  ## THIS LINE ##

序列化器代码

class MySerializer(serializers.ModelSerializer):
    def create(...):
        # call payment provider and process response
        payment = MyPayment()
        payment.save()   # contains response from the provider that I always want to keep
        return payment

DRF 不会回滚事务,除非它是 an exceptions and it meets some criteria

看起来问题出在 Django REST 框架之外。

仔细检查您的中间件,如果出现非 200 错误,某些中间件可能会应用回滚。