Динамическое обновление pandas NaN на основе типа поля в модели django

Мне нужно сохранить данные из файла csv в модели django. Данные поступают из внешнего api, поэтому я не могу контролировать их структуру. В моей схеме я разрешил всем полям быть nullable.

Это мой скрипт

   text = f"{path}/report.csv"
        df = pd.read_csv(text)
        row_iter = df.iterrows()

        for index, row in row_iter:
            rows = {key.replace("-", "_"): row.pop(key) for key in row.keys()}
            # print(f"rows {rows}")
            # default_values = {
            #     "amazon-order-id",merchant-order-id,purchase-date,last-updated-date,order-status,fulfillment-channel,sales-channel,order-channel,ship-service-level,product-name,sku,asin,item-status,quantity,currency,item-price,item-tax,shipping-price,shipping-tax,gift-wrap-price,gift-wrap-tax,item-promotion-discount,ship-promotion-discount,ship-city,ship-state,ship-postal-code,ship-country,promotion-ids,is-business-order,purchase-order-number,price-designation,is-iba,order-invoice-type
            # }

            sb, created = Order.objects.update_or_create(
                sellingpartner_customer=c,
                amazon_order_id=rows["amazon_order_id"],
                sku=rows["sku"],
                asin=rows["asin"],
                defaults={**rows},
            )

Однако, поскольку некоторые поля csv имеют пустые значения, pandas заменит их значением NaN, в этом случае django возвращает ошибку

   django.db.utils.OperationalError: (1054, "Unknown column 'NaN' in 'field list'")

Я пробовал заменить пустые значения пустой строкой("")

   df.fillna("", inplace=True)

Но django вернет ошибку для полей, которые не являются charfields

   django.core.exceptions.ValidationError: ['“” value must be a decimal number.']

Мой вопрос в том, как вы обрабатываете пустые значения из csv файла в pandas, например, если тип поля boolean, pandas просто заменит пустое значение на boolean False для полей типа boolean в django, 0 для пустых десятичных типов, и просто blank для пустых charfields, и т.д.?

Нулевые модели Django не будут принимать np.nan или другие совместимые с Pandas not-a-number объекты. Он ожидает принимать None, как в стандартном Python. Когда у вас есть значения nan, прежде чем сохранить их в Django, просто замените их на None, чтобы избежать ошибки валидации.

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