Как заменить пустые значения из api запроса на число

У меня есть часть кода, которая извлекает данные API с внешнего сайта. Проблема заключается в том, что во время извлечения данных он также сохраняет их в базе данных, если они не существуют. Некоторые значения из JSON-данных, которые я извлекаю, пустые, а база данных ожидает целое число при сохранении. Как мне преобразовать пустые строки JSON данных в значение по умолчанию 0 ?

Ошибка

ValueError at /
Field 'he_displaced_threshold_ft' expected a number but got ''.

services.py

def get_runways():
    params = {
        "apiToken": "SECRET",
    }
    api_base = "https://airportdb.io/api/v1/airport/KMIA"
    api_result = requests.get(api_base, params)
    api_response = api_result.json()

    for the runway in api_response["runways"]:
        runway_data, created = Runway.objects.update_or_create(
            airport_ident=Airport.objects.get(ident=runway["airport_ident"]),
            length_ft=runway["length_ft"],
            width_ft=runway["width_ft"],
            surface=runway["surface"],
            lighted=runway["lighted"],
            closed=runway["closed"],
            le_ident=runway["le_ident"],
            le_latitude_deg=runway["le_latitude_deg"],
            le_longitude_deg=runway["le_longitude_deg"],
            le_elevation_ft=runway["le_elevation_ft"],
            le_heading_degT=runway["le_heading_degT"],
            le_displaced_threshold_ft=runway["le_displaced_threshold_ft"],
            he_ident=runway["he_ident"],
            he_latitude_deg=runway["he_latitude_deg"],
            he_longitude_deg=runway["he_longitude_deg"],
            he_elevation_ft=runway["he_elevation_ft"],
            he_heading_degT=runway["he_heading_degT"],
            he_displaced_threshold_ft=runway["he_displaced_threshold_ft"],
        )
        runway_data.save()

    return runway

models.py

class Runway(models.Model):
    airport_ident = models.ForeignKey(Airport, on_delete=models.CASCADE)
    length_ft = models.IntegerField(default=None, blank=True, null=True)
    width_ft = models.IntegerField(default=None, blank=True, null=True)
    surface = models.CharField(max_length=50, blank=True, null=True)
    lighted = models.IntegerField(default=None, blank=True, null=True)
    closed = models.PositiveBigIntegerField(default=None, blank=True, null=True)
    le_ident = models.CharField(max_length=5, blank=True, null=True)
    le_latitude_deg = models.FloatField(default=None, blank=True, null=True)
    le_longitude_deg = models.FloatField(default=None, blank=True, null=True)
    le_elevation_ft = models.IntegerField(default=None, blank=True, null=True)
    le_heading_degT = models.FloatField(default=None, blank=True, null=True)
    le_displaced_threshold_ft = models.IntegerField(blank=True, null=True)
    he_ident = models.CharField(max_length=5, blank=True, null=True)
    he_latitude_deg = models.FloatField(default=None, blank=True, null=True)
    he_longitude_deg = models.FloatField(default=None, blank=True, null=True)
    he_elevation_ft = models.IntegerField(default=None, blank=True, null=True)
    he_heading_degT = models.FloatField(default=0, blank=True, null=True)
    he_displaced_threshold_ft = models.IntegerField(default=0, blank=True, null=True)

    def __str__(self):
        return self.airport_ident.ident

Я бы настоятельно рекомендовал вам использовать Pandas вместо выполнения ручных проверок, поскольку это позволит использовать более оптимизированные методы для разбора данных по желанию, а также будет полезно для сохранения их в базе данных.

import pandas as pd
from pandas import json_normalize
from sqlalchemy import create_engine

apiURL = '' # Your API URL
apiResponse = requests.get(apiURL).json()

normalizedDF = json_normalize(apiResponse)
normalizedDF.fillna(0) # Replacing NaN values with 0

# Inserting dataframe to your database
innoDBEngine = create_engine(f'mysql+mysqlconnector://{DB_USER}:%s@{DB_HOST}:3306/{DB_NAME}' % quote(DB_PASS))
normalizedDF.to_sql(DB_TABLE_NAME, innoDBEngine, index = False, if_exists = 'append', chunksize = 1000)

Этот метод, на мой взгляд, более оптимизирован для решения поставленной задачи. Надеюсь, это поможет! 😊

Вернуться на верх