Используйте библиотеку import_export django для импорта персонализированного экспорта CSV
В моем приложении есть два действия. Сначала я экспортирую данные в CSV, используя специальные ресурсы (см. ниже), чтобы иметь персонализированные заголовки и имя конкретного внешнего ключа вместо Id. Это нормально для экспорта CSV файла. Для импорта этого файла после модификации ... Возникает ошибка : **Integrity Error: (1048, "Column 'produit_id' cannot be null") **
Ниже приведен класс ресурсов для Greffons, позволяющий получить имя определенных колонок и упорядочить колонки в Meta.
class GreffonResource(resources.ModelResource):
comm = fields.Field(
column_name='Pre-Commandes',
attribute='comm',
)
greffons = fields.Field(
column_name='Greffons',
attribute='greffons',
)
objectif = fields.Field(
column_name='Objectifs',
attribute='objectif',
)
realise = fields.Field(
column_name='Realises',
attribute='realise',
)
reussi = fields.Field(
column_name='Reussis',
attribute='reussi',
)
produit = fields.Field(
column_name='Produits',
attribute='produit',
widget=widgets.ForeignKeyWidget(Produit, 'nom')
)
rang = fields.Field(
column_name='Rangs',
attribute='rang',
)
class Meta:
model = Greffons
fields = ('id', 'produit', 'comm', 'greffons', 'objectif', 'realise', 'reussi', 'rang')
export_order = ['id', 'produit', 'comm', 'greffons', 'objectif', 'realise', 'reussi', 'rang']
import_id_fields = ('id',)
После экспорта CSV файла, я изменяю данные внутри и импортирую их после, но ошибка :( Ниже приведен код для импорта данных после POST.
produit_resource = GreffonResource()
dataset = Dataset()
new_datas = request.FILES['myfile']
imported_data = dataset.load(new_datas.read().decode(), format='csv')
if categorie == "GREFFONS":
result = produit_resource.import_data(imported_data, dry_run=True, raise_errors=True)
Скорее всего, в вашем csv есть значение Produits.nom
, которое не сопоставлено ни с одним существующим экземпляром Produit
. Это вызывает ошибку при создании с нулевым значением.
Вам необходимо просмотреть файл импорта и проверить все значения столбца 'Produits'. Убедитесь, что любое значение в нем может быть сопоставлено с записью nom
в таблице Produit
. Может быть, есть пустые значения для 'nom', которые интерпретируются как null?
Эта строка объявляет, что ваш столбец csv под названием 'Produits' будет иметь значение, которое соответствует Produit.nom
:
produit = fields.Field(
column_name='Produits',
attribute='produit',
widget=widgets.ForeignKeyWidget(Produit, 'nom')
)
Если вы не можете найти источник проблемы, лучше всего выполнить импорт с помощью отладчика, и вы увидите, в чем именно проблема.