我正在尝试将excel文档导入Django DB。我已将以下代码添加到admin.py
和model.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)
答案 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
字段中包含字段IDfields = ('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。