python - 如何在 django-import-export 中导入 django-taggit 标签

标签 python django python-3.x django-import-export django-taggit

我无法使用 Django-import-export 导入 Django-taggit 标签。

此错误是在输入值时出现的。

Line number: 1 - invalid literal for int() with base 10: 'def'

另外,这个错误是当值为空时。

Line number: 2 - Cannot add <QuerySet []> (<class 'django.db.models.query.QuerySet'>). Expected <class 'django.db.models.base.ModelBase'> or str.

我还在 This issue 中发布了问题.

xlsx表‖也有一个id列。

enter image description here

模型.py

from django.db import models
from django.urls import reverse
from taggit.managers import TaggableManager

class KnowHow(models.Model):    

    author = models.ForeignKey('auth.User',on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField(blank=True)
    file = models.FileField(blank=True,upload_to='explicit_knowhows')
    free_tags = TaggableManager(blank=True)

    def __str__(self):
        return self.title

admin.py

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

from .models import KnowHow
# Register your models here.

class KnowHowResource(resources.ModelResource):

    class Meta:
        model = KnowHow
        import_id_fields = ['id']

@admin.register(KnowHow)
class knowHowAdmin(ImportExportModelAdmin):
    resource_class = KnowHowResource

最佳答案

我的解决方案:

自定义小部件:

from import_export import fields
from import_export import widgets
from taggit.forms import TagField
from taggit.models import Tag

class TagWidget(widgets.ManyToManyWidget):
    def render(self, value, obj=None):
        return self.separator.join(
            [obj.name for obj in value.all()]
        )

    def clean(self, value, row=None, *args, **kwargs):
        values = TagField().clean(value)
        return [
            Tag.objects.get_or_create(name=tag)[0]
            for tag in values
        ]

然后我们也必须覆盖字段:

class TagFieldImport(fields.Field):

    def save(self, obj, data, is_m2m=False):
        # This method is overridden because originally code
        # getattr(obj, attrs[-1]).set(cleaned, clean=True) doesn't unpack cleaned value
        if not self.readonly:
            attrs = self.attribute.split('__')
            for attr in attrs[:-1]:
                obj = getattr(obj, attr, None)
            cleaned = self.clean(data)
            if cleaned is not None or self.saves_null_values:
                if not is_m2m:
                    setattr(obj, attrs[-1], cleaned)
                else:
                    # Change only here
                    getattr(obj, attrs[-1]).set(*cleaned, clean=True)

然后像那样在资源中使用:

    tags = cure_widgets.TagFieldImport(
        attribute="tags",
        column_name="tags",
        widget=cure_widgets.TagWidget(Tag, separator=", ")
    )

关于python - 如何在 django-import-export 中导入 django-taggit 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59582619/

相关文章:

python - 在 supervisord 下运行 python 时证书验证失败

Python Tkinter 随机生成颜色?

python - 从数据框中删除空白列不起作用,Python 3.6

python - Socket sendall() 方法抛出 TypeError : a bytes-like object is required, 而不是 'str'

python - 在 Python 中使用 0xFFFFFFFF 掩码检测 int32 溢出?

python - Blender 模态运算符(operator)无法插入关键帧和移动对象

python - 简化处理当前使用 datetime 和 isodate 的时间和持续时间的代码?

python - Django:关闭选项卡时自动注销(不是浏览器)

python - Django:ImportError:无法导入名称_compare_digest

python - 在Mac上安装Django+MySql