如何在Django通用视图中通过GET请求更新数据库
解决Django通用视图中更新BTC余额的问题
要在GET请求返回钱包列表前,调用区块链接口更新对应地址的余额,你需要重写ListCreateAPIView的list方法,在返回数据前完成余额更新操作。
实现步骤
- 重写
list方法(该方法负责处理GET请求的列表查询逻辑) - 遍历所有钱包记录,调用区块链API获取最新余额
- 将API返回的余额转换为模型所需格式,更新数据库
- 返回更新后的钱包列表数据
修改后的视图代码
import requests from django.db import transaction from rest_framework import generics from .models import Wallet from .serializers import WalletSerializer class WalletListCreateAPIView(generics.ListCreateAPIView): queryset = Wallet.objects.all() serializer_class = WalletSerializer def list(self, request, *args, **kwargs): # 获取所有钱包记录 wallets = Wallet.objects.all() # 原子事务确保数据一致性 with transaction.atomic(): for wallet in wallets: try: # 调用Blockchain API获取地址余额(返回单位为聪) api_url = f"https://blockchain.info/q/addressbalance/{wallet.address}" response = requests.get(api_url) response.raise_for_status() # 触发HTTP错误异常 # 转换为BTC单位(1 BTC = 100,000,000 聪) satoshi_balance = int(response.text) btc_balance = satoshi_balance / 10**8 # 更新数据库中的余额 wallet.balance = btc_balance wallet.save() except requests.exceptions.RequestException as e: # 捕获API请求异常,可根据需求记录日志或跳过该地址 print(f"更新地址 {wallet.address} 余额失败: {str(e)}") continue # 调用父类方法返回更新后的列表数据 return super().list(request, *args, **kwargs)
关键注意事项
- 异常处理: 加入了API请求的异常捕获,避免单个地址更新失败导致整个请求崩溃
- 性能优化: 若钱包数量较多,建议使用批量API请求或异步请求(如
aiohttp)提升效率 - API速率限制: 外部API通常有调用频率限制,可添加缓存机制(如设置更新间隔)减少请求次数
- 数据一致性: 使用
transaction.atomic()保证余额更新操作的原子性,防止部分更新成功部分失败的情况
内容的提问来源于stack exchange,提问作者Liondancer
相关产品推荐
相关产品推荐

