带有FK约束的Django导入端口

2024-10-03 00:23:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试使用Django import-export将数据导入到我的Django项目中。我有两个模型Ap和Job,Job与Ap有FK关系。使用管理员,我可以选择文件和类型,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

管理员

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文件,要导入的数据。我已经尝试将第一列留空,就像将唯一Ap的Id存储在表ie 1中一样。我还努力编写了第_num行,它也是第一列

用于导入数据的CSV文件:

CSV file for importing data

导入错误的日期:

Date importing errors


Tags: importselfformfalsetruedatavaluemodels
1条回答
网友
1楼 · 发布于 2024-10-03 00:23:32

在您的资源中,定义字段时,需要在列表中包含id字段。所以将JobResource更改为following

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

如果定义了自定义id字段,则需要提供import\u id\u fields=('your\u id\u field')

相关问题 更多 >