Ошибка импорта 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
Вернуться на верх