Импорт и экспорт пакета Django Проблема импорта CSV-файла с внешним ключом
Я пытаюсь импортировать оценки для данных о студентах и продолжаю получать сообщение об ошибке, что запрос не соответствует импорту. Я пытался указать импорту, чтобы он рассматривал поле state_province в качестве внешнего ключа, но мне кажется, что я неправильно его написал. Во-вторых, по какой-то причине в поле date не работает ограничение null, и я не понимаю, почему, поскольку данные в файле excel имеют правильный формат. Я установил в модели null=true, чтобы пока обойти.Вот мой код. Буду признателен за помощь. Спасибо
STUDENT MODEL
# Where Basic Student Data Is Stored
class Student(models.Model):
studentpsid= models.CharField(primary_key = True , default = "", max_length = 50, unique = True)
student_name = models.CharField(max_length = 50)
first_name = models.CharField(max_length = 50, default = "")
last_name = models.CharField(max_length = 50,default = "")
gender = models.CharField(max_length = 1,default = "")
birth_date = models.DateField(blank= True)
student_grade = models.CharField(max_length = 2, default = "")
home_room = models.CharField(max_length = 5, default = "")
student_enrollment = models.CharField(max_length = 2, default = "")
school_number = models.CharField(max_length = 15, default = "")
email = models.EmailField(default = "")
projected_graduation_year = models.CharField(max_length = 4, default = "")
counseling_goal = models.TextField(max_length = 500, blank = True)
win_username = models.CharField(max_length = 50, blank=True)
win_password = models.CharField(max_length = 50, blank=True)
offsite_laptop = models.BooleanField(default = False, blank = True)
state_province_id = models.CharField(max_length = 50, default = "", unique=True)
lunch_balance = models.FloatField(blank = True, default = 0)
race = models.CharField(max_length = 1, blank = True)
alert_medical = models.TextField(max_length = 500, blank =True)
district_code = models.ForeignKey(NJDistictCodes,on_delete = models.PROTECT, blank = True, default = 0)
image = models.ImageField(default ="default.png", upload_to ='student_pics')
TEST SCORE MODEL
class MindPrint(models.Model):
state_province = models.ForeignKey(Student, to_field="state_province_id" ,on_delete = models.CASCADE, default = "")
test_date = models.DateField(null=True)
reasoning_verbal = models.CharField(max_length = 1, default = 0, blank = True)
reasoning_spatial = models.CharField(max_length = 1, default = 0, blank = True)
reasoning_abstract = models.CharField(max_length = 1, default = 0, blank = True)
executive_flexibility = models.CharField(max_length = 1, default = 0, blank = True)
executive_working_memory = models.CharField(max_length = 1, default = 0, blank = True)
executive_attention = models.CharField(max_length = 1, default = 0, blank = True)
speed_processing = models.CharField(max_length = 1, default = 0, blank = True)
speed_visual_motor = models.CharField(max_length = 1, default = 0, blank = True)
memory_verbal = models.CharField(max_length = 1, default = 0, blank = True)
memory_visual = models.CharField(max_length = 1, default = 0, blank = True)
class Meta:
verbose_name_plural = "Mind Print"
def __str__(self):
return str(self.state_province)
Вот мои настройки файла Admin.py.
from inspect import Attribute
from django.contrib import admin
from import_export.admin import ImportExportActionModelAdmin
from import_export import resources, fields
from import_export.widgets import ForeignKeyWidget
from .models import Student, MindPrint
class MindPrintResource (resources.ModelResource):
class Meta:
model = MindPrint
import_id_fields = ('state_province',)
state_province = fields.Field(column_name='state_province', attribute='state_province',widget=ForeignKeyWidget(Student, 'state_province_id'))
fields = ('state_province','test_date','reasoning_verbal','reasoning_spatial','reasoning_abstract','executive_flexibility','executive_working_memory',
'executive_attention','speed_processing','speed_visual_motor','memory_verbal','memory_visual')
class MindPrintAdmin (ImportExportActionModelAdmin):
resource_class = MindPrintResource
list_display = ('state_province_id','student_name','test_date','reasoning_verbal','reasoning_spatial','reasoning_abstract','executive_flexibility','executive_working_memory',
'executive_attention','speed_processing','speed_visual_motor','memory_verbal','memory_visual')
def student_name(self,obj):
return obj.state_province.student_name
admin.site.register(MindPrint,MindPrintAdmin)
Вот скриншот ошибки при импорте.
Вы не можете установить default = "" в ForeignKey. Он не найдет объект Student с "" в качестве первичного ключа. Вы можете установить его в default = None, но тогда вам, возможно, придется установить также null = True.
Вы настроили импорт объекта модели MindPrint. При импорте исходного файла данных ожидается наличие поля state_province, которое является FK-ссылкой на модель Student. Поскольку это FK-отношение, процесс импорта ожидает, что эта ссылка существует. В вашем случае ресурс Student с state_province из 1234567899 не существует, и поэтому вы видите ошибку Student.DoesNotExist.
Существует несколько API-хуков, которые можно использовать для проверки отсутствия Student строк и создания их, если они не существуют. Или вы можете переопределить ForeignKeyWidget, чтобы создать ресурс перед поиском.
