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
相关产品推荐
相关产品推荐

