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

Django调用KrakenAPI时报错“fees字段预期数字却得到数组”如何解决

错误原因

报错核心是Django模型普通字段类型无法直接存储Python列表/嵌套列表结构,常见的IntegerField、CharField仅支持接收单个基础类型值,传入数组会触发类型不匹配错误。

解决方案

方案1:PostgreSQL数据库专用方案(性能最优)

如果你项目使用PostgreSQL作为数据库,可以直接使用Django内置的PostgreSQL扩展字段ArrayField,修改models.py中Kraken模型的定义:

from django.db import models
from django.contrib.postgres.fields import ArrayField

class Kraken(models.Model):
    # 原有正常返回的字段保留原有定义即可
    altname = models.CharField(max_length=50)
    wsname = models.CharField(max_length=50)
    aclass_base = models.CharField(max_length=50)
    base = models.CharField(max_length=50)
    aclass_quote = models.CharField(max_length=50)
    quote = models.CharField(max_length=50)
    lot = models.CharField(max_length=50)
    pair_decimals = models.IntegerField()
    lot_decimals = models.IntegerField()
    lot_multiplier = models.IntegerField()
    # 数组类型字段定义
    leverage_buy = ArrayField(models.IntegerField())
    leverage_sell = ArrayField(models.IntegerField())
    # 嵌套数组嵌套两层ArrayField即可,fees包含整数和浮点数,用FloatField兼容
    fees = ArrayField(ArrayField(models.FloatField()))
    fees_maker = ArrayField(ArrayField(models.FloatField()))
    fee_volume_currency = models.CharField(max_length=50)
    margin_call = models.IntegerField()
    margin_stop = models.IntegerField()
    # ordermin部分交易对返回为空,添加null=True避免非空约束报错
    ordermin = models.CharField(max_length=50, null=True, blank=True)

修改完成后执行迁移命令即可:

python manage.py makemigrations
python manage.py migrate

之后取消视图中对应字段的注释即可正常存储。

方案2:全数据库兼容方案(支持MySQL、SQLite等所有数据库)

如果使用非PostgreSQL数据库,可以将数组类型数据以JSON格式存储,Django 3.1及以上版本原生支持全数据库兼容的JSONField,修改models.py:

from django.db import models

class Kraken(models.Model):
    # 原有正常返回的字段保留原有定义即可
    altname = models.CharField(max_length=50)
    wsname = models.CharField(max_length=50)
    aclass_base = models.CharField(max_length=50)
    base = models.CharField(max_length=50)
    aclass_quote = models.CharField(max_length=50)
    quote = models.CharField(max_length=50)
    lot = models.CharField(max_length=50)
    pair_decimals = models.IntegerField()
    lot_decimals = models.IntegerField()
    lot_multiplier = models.IntegerField()
    # 数组类型统一用JSONField存储
    leverage_buy = models.JSONField()
    leverage_sell = models.JSONField()
    fees = models.JSONField()
    fees_maker = models.JSONField()
    fee_volume_currency = models.CharField(max_length=50)
    margin_call = models.IntegerField()
    margin_stop = models.IntegerField()
    ordermin = models.CharField(max_length=50, null=True, blank=True)

同样执行迁移命令后,取消视图中对应字段的注释即可正常使用,读取数据时JSONField会自动将存储的JSON内容转回Python列表结构。

额外注意事项

部分交易对的ordermin字段返回为空,必须给对应模型字段添加null=True, blank=True参数,否则会触发非空约束报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:45:04