【问题标题】:Catch decimal.ConversionSyntax django import export捕捉小数.ConversionSyntax django import export
【发布时间】:2021-12-13 22:39:20
【问题描述】:

我需要能够以更加用户友好的方式显示有关无效小数和无效外键的错误。

我以为clean_model_instances = True 会抓住它,但它没有。

无效的十进制错误:

无效的外键错误:

我想要显示的是错误以及此处的所有其他错误:

提前致谢!

【问题讨论】:

    标签: django django-import-export


    【解决方案1】:

    有几种方法可以解决这个问题。

    1. 对于DecimalWidget,将其声明为CharWidget - 这将处理任何输入字符串,如果您启用了clean_model_instances,则验证模型对象时将引发错误。

    2. 对于ForeignKeyWidget,您必须重写clean() 方法,以便它为不存在的引用引发ValueError。 IMO 这并不理想,因为它违反了 clean() 函数的合同。错误消息并不完美,但它确实达到了您想要的效果。

    class ValidatingForeignKeyWidget(widgets.ForeignKeyWidget):
        def clean(self, value, row=None, *args, **kwargs):
            try:
                val = super().clean(value)
            except self.model.DoesNotExist:
                raise ValueError(f"{self.model.__name__} with value={value} does not exist")
            return val
    
    
    class BookResource(ModelResource):
        price = fields.Field(attribute='price', widget=widgets.CharWidget())
        author = fields.Field(attribute="author", widget=ValidatingForeignKeyWidget(Author))
    
        class Meta:
            model = Book
            clean_model_instances = True
    

    【讨论】:

    • 这非常有效。寿,覆盖clean() 方法会有多糟糕?它会以任何方式影响导入导出库吗?
    • 不,我看不到它会导致任何问题,也看不到另一种实现它的方法。这个问题更具理论性,我们正在重写 clean 来执行验证,但因为它更优雅地处理错误,我认为这没关系。
    猜你喜欢
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多