Django呼叫'id'需要一个数字但得到了字符串

问题描述 投票:1回答:2

django-import-export库的Django错误。

我想通过django admin将数据从excel导入数据库。我用它为django-import-export,但是我得到了Field'id'期望有一个数字,但得到了'HPI'。

enter image description here

Excel文件包含enter image description here

我找到了答案,我必须添加exclude =('id',),但这没有帮助。我也做了迁移,也没有帮助。如何修复它并能够通过django admin将6列数据从Excel导入数据库?

models.py


    from django_mysql.models import JSONField, Model
    from django.db import models



    class Category(Model):
        title = models.CharField(max_length=100)

        class Meta:
            ordering = ('-id',)
            verbose_name = 'Category'
            verbose_name_plural = 'Categories'

        def __str__(self):
            return self.title


    class Tag(Model):
        title = models.CharField(max_length=100)

        class Meta:
            ordering = ('-id',)

        def __str__(self):
            return self.title


    class Type(Model):
        title = models.CharField(max_length=100)

        class Meta:
            ordering = ('-id',)
            verbose_name = 'Type'
            verbose_name_plural = 'Types'

        def __str__(self):
            return self.title


    class Macro(Model):
        type = models.ForeignKey(
            Type,
            max_length=100,
            null=True,
            blank=True,
            on_delete=models.SET_NULL)
        tags = models.ManyToManyField(Tag, blank=True)
        category = models.ForeignKey(
            Category, null=True, blank=True, on_delete=models.SET_NULL)
        abbreviation = models.CharField(max_length=100, unique=True)
        title = models.CharField(max_length=100, verbose_name='Title')
        content = models.TextField(max_length=1000, null=True, blank=True)

        class Meta:
            ordering = ('-id',)

        def __str__(self):
            return self.title

admin.py


    from django.contrib import admin

    from import_export import resources
    from import_export.admin import ImportExportModelAdmin

    from .models import Category, Tag, Type, Macro


    class MacroResource(resources.ModelResource):

        class Meta:
            model = Macro
            skip_unchanged = True
            report_skipped = True
            exclude = ('id', )
            export_order = ('type', 'tags', 'category', 'abbreviation', 'title', 'content')


    @admin.register(Macro)
    class MacroAdmin(ImportExportModelAdmin):
        resource_class = MacroResource
        list_display = ('id', 'type', 'tags_list', 'category', 'abbreviation', 'title', 'content')
        search_fields = ('title', 'category__title', 'type__title', 'abbreviation', 'content', )

        def tags_list(self, obj):
            tags = [t for t in obj.tags.all()]
            return ' '.join(str(tags)) if tags else '-'


    @admin.register(Category)
    class CategoryAdmin(admin.ModelAdmin):
        list_display = ('id', 'title')


    @admin.register(Tag)
    class TagAdmin(admin.ModelAdmin):
        list_display = ('id', 'title')

        def __str__(self):
            return self.title


    @admin.register(Type)
    class TypeAdmin(admin.ModelAdmin):
        list_display = ('id', 'title')

python django django-admin django-import-export
2个回答
1
投票

Django-import-export期望第一列为id

如果这些是新对象,只需将id列留空。否则,将对象的数据库ID放在该字段中。

如果您无法修改文件或不想修改文件,并且将总是向数据库添加新行(而不修改现有行),则可以在以下位置动态创建一个id字段:您的资源类,方法是重写方法before_import并强制get_instance始终返回False

class MacroResource(resources.ModelResource):

    def before_import(self, dataset, using_transactions, dry_run, **kwargs):
        dataset.insert_col(0, col=["",]*dataset.height, header="id")

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

    class Meta:
        model = Macro
        skip_unchanged = True
        report_skipped = True
        export_order = ('type', 'tags', 'category', 'abbreviation', 'title', 'content')

0
投票

问题出在数据库模型的ForeignKey和ManyToMany字段上。因此,django-import-export库需要获取此字段的小部件。解:admin.py


        class MacroResource(resources.ModelResource):

            def before_import(self, dataset, using_transactions, dry_run, **kwargs):
                dataset.insert_col(0, col=["", ] * dataset.height, header="id")

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

            type = fields.Field(
                column_name='type',
                attribute='type',
                widget=ForeignKeyWidget(Type, 'title'))

            category = fields.Field(
                column_name='category',
                attribute='category',
                widget=ForeignKeyWidget(Category, 'title'))

            tags = fields.Field(
                column_name='tags',
                attribute='tags',
                widget=ManyToManyWidget(Tag, field='title'))

            class Meta:
                model = Macro
                skip_unchanged = True
                report_skipped = True
                exclude = ('id', )
                import_id_fields = ('title',)

                fields = ('type', 'tags', 'category', 'abbreviation', 'title', 'content')

而不是


        class MacroResource(resources.ModelResource):

            class Meta:
                model = Macro
                skip_unchanged = True
                report_skipped = True
                exclude = ('id', )
                export_order = ('type', 'tags', 'category', 'abbreviation', 'title', 'content')


© www.soinside.com 2019 - 2024. All rights reserved.