6

我正在尝试将 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

你们能提供的任何帮助都会很棒。

管理员.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')

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

5 回答 5

1

您可以使用以下步骤解决此问题:

第 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 文件并运行服务器。

于 2020-05-10T13:49:55.467 回答
0

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

Python 2.7 | Django 1.11 | Django 导入导出 1.0.0 (2018-02-13)

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

资源.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', )

管理员.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')
于 2018-04-05T09:32:35.610 回答
0

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

确保id列应该是 CSV 或 Excel 文件中的第一列

于 2019-12-02T21:00:22.923 回答
-1

在 ModelResource 的字段中包含字段 id

fields = ('id','VIN','LatestOpenCaseID','LatestClosedCaseID', 
              'OpenDate', 'CloseDate', 'HasCampaigns',)

并在您的 excel 文件中添加一个字段 id 为空值的列。这将添加一个具有自动增量的新字段。

文件.xls

id  VIN  OpenDate ...
    23   05-10-2018
    24   05-11-2018
于 2018-03-28T07:02:26.500 回答
-1

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 的真实文档中的管理员集成

于 2020-07-22T20:05:51.050 回答