【问题标题】:Override Django model field get_prep_value method覆盖 Django 模型字段 get_prep_value 方法
【发布时间】:2021-05-17 23:29:08
【问题描述】:

当从 Django 中的 ForeignKey 字段中获取 ValueError 时,异常会使用字段名称返回响应“Field ...期望一个数字但得到...”。我想更改此异常以使用 verbose_name(如果存在)和字段名称(如果不存在)。如何为所有 ForeignKey 字段覆盖此异常?

https://github.com/django/django/blob/main/django/db/models/fields/__init__.py 中的第 1818 行

    def get_prep_value(self, value):
        value = super().get_prep_value(value)
        if value is None:
            return None
        try:
            return int(value)
        except (TypeError, ValueError) as e:
            raise e.__class__(
                "Field '%s' expected a number but got %r." % (self.name, value),
            ) from e

【问题讨论】:

    标签: python django


    【解决方案1】:

    我最终通过覆盖 IntegerField 和 AutoField 类来获得此自定义错误消息。

    class CustomIntegerField(models.Field):
        def get_prep_value(self, value):
            value = super().get_prep_value(value)
            if value is None:
                return None
            try:
                return int(value)
            except (TypeError, ValueError) as e:
                field_name = self.name
                if self.verbose_name:
                    field_name = self.verbose_name
                raise e.__class__("Custom Error Message") from e
    
    class CustomAutoField(AutoFieldMixin, CustomIntegerField, metaclass=AutoFieldMeta):
        ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      • 2017-05-07
      • 2012-05-10
      • 1970-01-01
      • 2017-05-03
      • 1970-01-01
      相关资源
      最近更新 更多