Ao acessar o endpoint /api/metadata/user_tables/{id}/data/, tabelas que possuem
colunas do tipo float com valores NaN resultam em um erro 500 Internal Server Error.
ValueError: Out of range float values are not JSON compliant: nan
Reprodução
- Cadastrar uma tabela que contenha colunas float com valores
NaN
- Fazer uma requisição
GET /api/metadata/user_tables/{id}/data/?page=1&pageSize=50
- Observar o erro
500
Causa
Valores NaN, Infinity e -Infinity são válidos no padrão IEEE 754 (usado por
bancos de dados e pelo Python), mas não são permitidos pela especificação JSON.
O serializador padrão do Django REST Framework falha ao tentar converter esses valores.
Solução
Adicionado o método sanitize_rows em UserTableViewSet que percorre os dados em
um único loop recursivo e aplica todas as sanitizações necessárias antes da
serialização:
NaN, Infinity, -Infinity → null
- Inteiros maiores que
Number.MAX_SAFE_INTEGER → string (comportamento anterior
do método convert_bigints_to_string, que foi removido e consolidado aqui)
O método é extensível: novas transformações podem ser adicionadas dentro do mesmo
loop sem custo adicional de iteração.
Ao acessar o endpoint
/api/metadata/user_tables/{id}/data/, tabelas que possuemcolunas do tipo float com valores
NaNresultam em um erro500 Internal Server Error.Reprodução
NaNGET /api/metadata/user_tables/{id}/data/?page=1&pageSize=50500Causa
Valores
NaN,Infinitye-Infinitysão válidos no padrão IEEE 754 (usado porbancos de dados e pelo Python), mas não são permitidos pela especificação JSON.
O serializador padrão do Django REST Framework falha ao tentar converter esses valores.
Solução
Adicionado o método
sanitize_rowsemUserTableViewSetque percorre os dados emum único loop recursivo e aplica todas as sanitizações necessárias antes da
serialização:
NaN,Infinity,-Infinity→nullNumber.MAX_SAFE_INTEGER→string(comportamento anteriordo método
convert_bigints_to_string, que foi removido e consolidado aqui)O método é extensível: novas transformações podem ser adicionadas dentro do mesmo
loop sem custo adicional de iteração.