Динамическое обновление 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
, чтобы избежать ошибки валидации.