You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DRF表单数据传入函数问题:支付接口UnboundLocalError报错求解

DRF支付功能:获取POST数据生成支付URL的解决方案

核心思路

不要在数据保存前查询数据库,直接从序列化器的validated_data或者request.data中提取所需字段(amount、currency、order_id等)——这两个来源在perform_create阶段已经能拿到前端提交的有效数据,无需依赖数据库查询。

具体实现方法

方法1:从序列化器的validated_data提取(推荐)

序列化器已完成数据校验,validated_data是经过验证的可靠数据,优先使用该方式:

class PaymentViewSet(viewsets.ModelViewSet):
    queryset = Payment.objects.all()
    serializer_class = PaymentSerializer

    def perform_create(self, serializer):
        # 直接从校验后的数据集提取字段
        amount = serializer.validated_data.get('amount')
        currency = serializer.validated_data.get('currency')
        order_id = serializer.validated_data.get('order_id')
        user = self.request.user  # 获取当前请求的用户信息

        # 执行签名和支付URL生成逻辑
        signature = generate_signature(amount, currency, order_id, user.id)
        payment_url = generate_payment_url(amount, currency, order_id, signature, user.email)

        # 保存时可将生成的URL等字段存入数据库(按需)
        serializer.save(payment_url=payment_url, user=user)

方法2:从request.data提取(适用于未通过序列化器校验的额外字段)

如果部分字段不需要序列化器校验,或需要直接获取原始提交数据,可使用request.data:

def perform_create(self, serializer):
    amount = self.request.data.get('amount')
    currency = self.request.data.get('currency')
    order_id = self.request.data.get('order_id')
    user = self.request.user

    # 执行签名和支付URL生成逻辑
    # ...

    # 保存数据
    serializer.save(...)

错误原因说明

之前出现UnboundLocalError,是因为你在serializer.save()执行前就去数据库查询Payment实例,但此时数据还未写入数据库,查询结果为空导致变量未赋值就被引用。改用上述两种方式直接获取前端提交的有效数据,即可避免该问题。

内容的提问来源于stack exchange,提问作者Yevhenii Hrybanov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:54:20