Ошибка импорта Django Admin: NOT NULL Constraint Failed for ForeignKey Field in CSV Import
У меня возникла постоянная проблема с импортом CSV-данных в мой Django-проект с помощью библиотеки django-import-export в панели администратора. При попытке импортировать записи для модели Copy, которая имеет отношения ForeignKey, я постоянно сталкиваюсь с ошибкой NOT NULL constraint failed для поля book_id. И ЭТО ПРОИСХОДИТ ТОЛЬКО В АДМИНСКОЙ ПАНЕЛИ, я тестировал в оболочке и все работает. Я уверен, что нет проблем с CSV и, скорее всего, даже с файлами ресурсов/моделей. Похоже, что-то идет не так с логикой администратора перед фактическим импортом.
Ошибка выглядит следующим образом, но для каждого отдельного ряда. Она возникает при нажатии кнопки "Отправить". Я даже не дохожу до кнопки "Подтвердить импорт"
Line number: 1 - NOT NULL constraint failed: catalog_copy.book_id
Line number: 2 - NOT NULL constraint failed: catalog_copy.book_id
Line number: 3 - NOT NULL constraint failed: catalog_copy.book_id
Line number: 4 - NOT NULL constraint failed: catalog_copy.book_id
Line number: 5 - NOT NULL constraint failed: catalog_copy.book_id
Line number: 6 - NOT NULL constraint failed: catalog_copy.book_id
Line number: 7 - NOT NULL constraint failed: catalog_copy.book_id
Line number: 8 - NOT NULL constraint failed: catalog_copy.book_id
Line number: 9 - NOT NULL constraint failed: catalog_copy.book_id
Line number: 10 - NOT NULL constraint failed: catalog_copy.book_id```
Here are the relevant parts of my code:
**models.py
**```
from django.db import models
from django.core.exceptions import ValidationError
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=100)
isbn = models.CharField(max_length=13)
class Format(models.Model):
name = models.CharField(max_length=100)
class Copy(models.Model):
book = models.ForeignKey(Book, related_name='copies', on_delete=models.CASCADE)
format = models.ForeignKey(Format, related_name='copies', on_delete=models.CASCADE)
location = models.CharField(max_length=100)
is_available = models.BooleanField(default=True)
resources.py
from import_export import resources
from .models import Copy
class CopyResource(resources.ModelResource):
class Meta:
model = Copy
fields = ('id', 'book', 'format', 'location', 'is_available')
import_id_fields = ['id']
def before_import_row(self, row, **kwargs):
book_title = row.get('Book Title')
isbn = row.get('ISBN')
author = row.get('Author')
format_name = row.get('Format')
book, created = Book.objects.get_or_create(
title=book_title,
defaults={'isbn': isbn, 'author': author}
)
format, created = Format.objects.get_or_create(
name=format_name
)
row['book'] = book.pk
row['format'] = format.pk
admin.py
from django.contrib import admin
from import_export.admin import ImportExportModelAdmin
from .models import Copy
from .resources import CopyResource
class CopyAdmin(ImportExportModelAdmin):
resource_class = CopyResource
admin.site.register(Copy, CopyAdmin)
Я вручную проверил CSV и даже протестировал загрузку в оболочке django, которая работала правильно. Но админ-панель по-прежнему не работает!!!
import tablib
...: from catalog.resources import CopyResource
...:
...: with open('library_copies.csv', 'r', encoding='utf-8') as f:
...: data = tablib.Dataset().load(f.read(), format='csv')
...:
...: resource = CopyResource()
...: result = resource.import_data(data, dry_run=False)
...:
...: if result.has_errors():
...: print("Errors occurred during the import:")
...: for error in result.base_errors:
...: print(f"Base error: {error.error}")
...: else:
...: print("The import would proceed without errors.")```
The above succeeds but import through admin panel always has NOT NULL error