例外:十进制.保存 Django 数据模型时引发的无效操作



我正在将加密货币数据存储到Django数据模型中(使用Postgres数据库(。 绝大多数记录都已成功保存。 但是,特别是在一条记录上,我得到了一个例外decimal.InvalidOperation.

奇怪的是,我看不出保存在有问题的记录中的值与成功保存的任何其他值有什么不同。 我已经在粘贴箱上包含了完整的堆栈跟踪。 在保存数据之前,我已经将原始值输出到调试日志中。 以下是我要将数据保存到的数据模型。以及将数据保存到数据模型的代码。

我被难住了!有人知道问题是什么吗?

数据模型

class OHLCV(m.Model):
""" Candles-stick data (open, high, low, close, volume) """
# class variables
_field_names = None
timeframes = ['1m', '1h', '1d']
# database fields
timestamp = m.DateTimeField(default=timezone.now)
market = m.ForeignKey('bc.Market', on_delete=m.SET_NULL, null=True, related_query_name='ohlcv_markets', related_name='ohlcv_market')
timeframe = m.DurationField() # 1 minute, 5 minute, 1 hour, 1 day, or the like
open = m.DecimalField(max_digits=20, decimal_places=10)
high = m.DecimalField(max_digits=20, decimal_places=10)
low = m.DecimalField(max_digits=20, decimal_places=10)
close = m.DecimalField(max_digits=20, decimal_places=10)
volume = m.DecimalField(max_digits=20, decimal_places=10)

保存数据模型的代码

@classmethod
def fetch_ohlcv(cls, market:Market, timeframe:str, since=None, limit=None):
"""
Fetch OHLCV data and store it in the database
:param market:
:type market: bc.models.Market
:param timeframe: '1m', '5m', '1h', '1d', or the like
:type timeframe: str
:param since:
:type since: datetime
:param limit:
:type limit: int
"""
global log
if since:
since = since.timestamp()*1000
exchange = cls.get_exchange()
data = exchange.fetch_ohlcv(market.symbol, timeframe, since, limit)
timeframe = cls.parse_timeframe_string(timeframe)
for d in data:
try:
timestamp = datetime.fromtimestamp(d[0] / 1000, tz=timezone.utc)
log.debug(f'timestamp={timestamp}, market={market}, timeframe={timeframe}, open={d[1]}, high={d[2]}, low={d[3]}, close={d[4]}, volume={d[5]}')
cls.objects.create(
timestamp=timestamp,
market=market,
timeframe=timeframe,
open=d[1],
high=d[2],
low=d[3],
close=d[4],
volume=d[5],
)
except IntegrityError:
pass
except decimal.InvalidOperation as e:
error_log_stack(e)

查看您的数据并检查它是否符合字段限制:

  1. 尾数必须适合max_digits;
  2. 小数位应小于decimal_places;
  3. 根据十进制验证器:整数位数不应大于max_digits-decimal_places;

不确定您的fetch_ohlcv函数如何填充数据数组,但如果有除法,则decimal_digits数可能大于 10。 我遇到的问题,把我带到这里,是整数部分的数字太多,因此无法满足最后一个要求。

有关类似问题的更多信息,请查看此答案。

相关内容

最新更新