簡體   English   中英

帶有 FK 約束的 Django 進出口

[英]Django import-export with FK constraint

我一直在嘗試使用 Django 導入導出將數據導入到我的 Django 項目中。 我有兩個模型 Ap 和 Job,Job 與 Ap 有 FK 關系。 使用管理員,我可以選擇文件和類型,CSV。 到目前為止,我的程序似乎可以運行,但在 FK 上掛斷了。 我很接近,有些東西關閉並導致導入腳本失敗。

模型.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)

視圖.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})

資源.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 即 1 置為空。我還嘗試對 line_num 進行硬編碼,第一列也是 1200。

用於導入數據的 CSV 文件:

用於導入數據的 CSV 文件

日期導入錯誤:

日期導入錯誤

在您的資源中,在定義字段時,您需要在列表中包含 id 字段。 因此將 JobResource 更改為跟隨。

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

如果您定義了自定義 id 字段,則需要提供 import_id_fields = ('your_id_field')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM