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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 16:10:56