Django导入导出行号:1 - u“未找到列'id'

时间:2015-05-28 16:25:24

标签: python django django-models django-admin django-import-export

我正在尝试将excel文档导入Django DB。我已将以下代码添加到admin.pymodel.py。 Django的开发似乎有一个错误。我已经阅读了几个关于如何修复此错误的不同文档。但我对如何完全实现它仍然有点迷失。

在Trace中,它一直说我的Excel文档需要一个id字段。我的Excel文档中没有id字段,也没有告诉我的模型查找id字段。

我发现的文档说明我应该在get_or_init_instance使用

  

https://django-import-export.readthedocs.org/en/latest/import_workflow.html

你们给予的任何帮助都会很棒。

admin.py

class VinCasesAndCampaignsResource(resources.ModelResource):
    published = fields.Field(column_name='published_date')

    def get_instance(self, instance_loaders, row):
        return False

    class Meta:
        model = VinCasesAndCampaigns
        widgets = {}
        fields = ('VIN','LatestOpenCaseID','LatestClosedCaseID', 
                  'OpenDate', 'CloseDate', 'HasCampaigns',)
        import_id_fields = ['VIN']
        export_order = ('VIN',)
        exclude = ('id')

model.py

class VinCasesAndCampaigns(models.Model):
    VIN = models.CharField(max_length=30)
    LatestOpenCaseID = models.DateField()
    LatestClosedCaseID = models.DateField()
    OpenDate = models.DateField()
    CloseDate = models.DateField()
    HasCampaigns = models.BooleanField(default = False)
    HasOpenCampaigns = models.BooleanField(default = False)
    HasCases = models.BooleanField(default = False)
    HasEstimates = models.BooleanField(default = False)
    HasDwell = models.BooleanField(default = False)
    HasClaims = models.BooleanField(default = False)

    exclude = ('id',)

跟踪:

> Line number: 1 - u"Column 'id' not found in dataset. Available columns
> are: [u'VIN', u'LatestOpenCaseID', u'LatestClosedCaseID', u'OpenDate',
> u'CloseDate', u'HasCampaigns', u'HasOpenCampaigns', u'HasCases',
> u'HasEstimates', u'HasDwell', u'HasClaims']" Traceback (most recent
> call last): File
> "/Users/USER/anaconda/lib/python2.7/site-packages/django_import_export-0.2.8.dev0-py2.7.egg/import_export/resources.py",
> line 342, in import_data instance, new =
> self.get_or_init_instance(instance_loader, row)

5 个答案:

答案 0 :(得分:2)

您可以通过以下步骤解决此问题:

步骤1 首先转到C:/Users/am.sa18/Desktop/myenv/Lib/site-packages/import_export/resources.py

第2步在编辑器中打开resources.py。

第3步在第84行进行了更改,看起来像这样

步骤4 import_id_fields = ['id']其中,默认情况下,“ id”由import_export软件包设置, 您可以通过模型的主键更改“ id”。 添加主键后:import_id_fields = ['primary_key']

第5步:保存resources.py文件并运行服务器。

答案 1 :(得分:1)

这是一个工作示例。我也使用"排除"它工作正常,无需在models.py中添加exclude =(' id',)。 我的数据集不包含" id"字段。

Python 2.7 | Django 1.11 | Django Import export 1.0.0(2018-02-13)

Models.py

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models
from django.template.defaultfilters import slugify
from django.contrib.auth.models import User

# Create your models here.

class CourseList(models.Model):
    short_code = models.CharField(max_length=10)
    course_id = models.CharField(max_length=50,null=True,blank=True,unique=True)
    title = models.CharField(max_length=100)
    status = models.CharField(max_length=10)
    count_current = models.IntegerField(default=0)
    count_cumulative = models.IntegerField(default=0)
    start_date = models.CharField(max_length=20)
    end_date = models.CharField(max_length=20)
    pacing_type = models.CharField(max_length=10)
    updated_date = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['end_date']

        def __unicode__(self):
            return self.title

resources.py

from import_export import resources, fields
from .models import CourseList

class CourseListResource(resources.ModelResource):
    status = fields.Field(column_name='availability', attribute="status")
    short_code = fields.Field(column_name='catalog_course', attribute="short_code")
    title = fields.Field(column_name='catalog_course_title', attribute="title")
    count_current = fields.Field(column_name='count', attribute="count_current")
    count_cumulative = fields.Field(column_name='cumulative_count', attribute="count_cumulative")


    class Meta:
        model = CourseList
        import_id_fields = ('course_id',)
        exclude = ('id', 'updated_date',)
        skip_unchanged = True
        fields = ('status', 'short_code','course_id', 'title', 'count_current', 'count_cumulative', 'end_date', 'pacing_type', 'start_date', )

admin.py

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.contrib import admin
from import_export.admin import ImportExportModelAdmin

# Register your models here.
from import_export import resources
from courselist.models import CourseList
from courselist.resources import CourseListResource


@admin.register(CourseList)
class CourseListAdmin(ImportExportModelAdmin):
    resource_class = CourseListResource
    list_display = ('id', 'course_id', 'title', 'start_date', 'end_date')

答案 2 :(得分:1)

只需先创建一个空列,即id,然后通过Django import_export导入相同的文件。

  

确保id列应位于CSV或Excel文件的第一列中

答案 3 :(得分:0)

在ModelResource

字段中包含字段ID
fields = ('id','VIN','LatestOpenCaseID','LatestClosedCaseID', 
              'OpenDate', 'CloseDate', 'HasCampaigns',)

并在您的Excel文件中添加一个带有空值的字段ID的列。这会添加一个带有自动增量的新字段。

file.xls

id  VIN  OpenDate ...
    23   05-10-2018
    24   05-11-2018

答案 4 :(得分:0)

admin.py应该是:

class CourseListAdmin(ImportExportModelAdmin):
    resource_class = CourseListResource
    list_display = ('id', 'course_id', 'title', 'start_date', 'end_date')

admin.site.register(CourseList, CourseListAdmin)

我的装饰器@ admin.register也有同样的问题。我可能遵循了相同的旧教程。有关django-import-export的信息,请参见真实文档中的Admin Integration