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

