Импорт-экспорт в Django с ограничением FK

Я пытался импортировать данные в мой Django проект с помощью Django import-export. У меня есть две модели Ap и Job, Job имеет FK отношения с Ap. Используя Admin, я могу выбрать файл и тип, CSV. Пока что моя программа вроде бы работает, но зависает на FK. Я близок к тому, что что-то не работает и вызывает сбой сценария импорта.

Models.py

class Ap(models.Model):
    line_num = models.IntegerField()
    vh = models.IntegerField()
    vz = models.IntegerField()
    status = models.CharField(
        choices=statuses, default="select", max_length=40)
    classified = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

class Job(models.Model):
    aplink = models.ForeignKey(Ap, related_name=(
        "job2ap"), on_delete=models.CASCADE)
    job_num = models.IntegerField()
    description = models.CharField(max_length=200)
    category = models.CharField(
        choices=categories, default="select", max_length=40)
    status = models.CharField(
        choices=statuses, default="select", max_length=40)
    dcma = models.BooleanField(default=False),
    due_date = models.DateField(blank=True),
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

views.py

class ImportView(View):

    def get(self, request):
        form = ImportForm()
        return render(request, 'importdata.html', {'form': form})

    def post(self, request):
        form = ImportForm(request.POST, request.FILES)
        job_resource = JobResource()
        data_set = Dataset()
        if form.is_valid():
            file = request.FILES['import_file']
            imported_data = data_set.load(file.read())
            result = job_resource.import_data(
                data_set, dry_run=True)  # Test the data import

            if not result.has_errors():
                job_resource.import_data(
                    data_set, dry_run=False)  # Actually import now

        else:
            form = ImportForm()
        return render(request, 'importdata.html', {'form': form})

resource.py

class CharRequiredWidget(widgets.CharWidget):
    def clean(self, value, row=None, *args, **kwargs):
        val = super().clean(value)
        if val:
            return val
        else:
            raise ValueError('this field is required')


class ForeignkeyRequiredWidget(widgets.ForeignKeyWidget):
    def clean(self, value, row=None, *args, **kwargs):
        if value:
            print(self.field, value)
            return self.get_queryset(value, row, *args, **kwargs).get(**{self.field: value})
        else:
            raise ValueError(self.field + " required")


class JobResource(resources.ModelResource):
    aplink = fields.Field(column_name='aplink', attribute='aplink', widget=ForeignkeyRequiredWidget(Ap,'id'),
                        saves_null_values=False)
    job_num = fields.Field(saves_null_values=False, column_name='job_num', attribute='job_num',
                        widget=widgets.IntegerWidget())
    description = fields.Field(column_name='description', attribute='description', saves_null_values=False, 
                        widget=CharRequiredWidget())

    class Meta:
        model = Job
        fields = ('aplink', 'job_num', 'description',)
        clean_model_instances=True

admin.py

class JobResource(resources.ModelResource):
    class Meta:
        model=Job
        fields=('aplink','job_num','description',)
        
class JobAdmin(ImportExportModelAdmin):
    resource_class = JobResource

admin.site.register(Job, JobAdmin)

CSV файл, данные для импорта. Я пробовал оставить первый столбец пустым, а также поместить Id единственного Ap, хранящегося в таблице, т.е. 1. Я также пробовал жестко кодировать номер строки, который также находится в 1200 первом столбце.

[CSV файл для импорта данных][1] [1]: https://i.stack.imgur.com/Rg8o3.png [Ошибки при импорте данных][2] [2]: https://i.stack.imgur.com/3FI4i.png

Любая помощь будет очень признательна.

Вернуться на верх