Django-如果在保存模型实例时遇到错误,如何检查哪个字段导致错误?

时间:2018-11-07 06:27:17

标签: django

假设我有以下模型MyModel(这只是一个示例;实际版本有数百个字段):

class MyModel(models.Model):
    date1 = models.DateField()
    date2 = models.DateField()
    date3 = models.DateField()

保存模型时,出现以下错误:

ValidationError: ["'' value has an invalid date format. It must be in YYYY-MM-DD format."]

基本上,其中一个字段接收的是空字符串,而不是正确的日期格式。但是,我不知道是date1date2还是date3引起了问题。

是否有一些简便的方法来检查哪个字段返回了此ValidationError

3 个答案:

答案 0 :(得分:0)

您可以通过覆盖save()这样直接验证模型字段,这还将提供验证失败的字段名称:

class MyModel(models.Model):
  date1 = models.DateField()
  date2 = models.DateField()
  date3 = models.DateField()

  def save(self, *args, **kwargs):
    self.full_clean()
    super(MyModel, self).save(*args, **kwargs)

但是,您应该避免这种情况,如here所述。

您还可以编写一个序列化程序,该序列化程序也可以用于其他复杂的验证(如果原始模型中有验证程序的话)。通过序列化器可以做到这一点:

创建您自己的验证器:

class DateFormatValidator(object):

    def __init__(self, field_name=""):
        self.field_name = field_name

    def __call__(self, value):
        try:
            datetime.datetime.strptime(value, '%Y-%m-%d')
        except ValueError:
            raise serializers.ValidationError("Incorrect data format for {} field, should be YYYY-MM-DD"
                                              .format(self.field_name))

,然后将其用于序列化程序类中的每个字段,例如:

date1 = serializers.CharField(validators=[DateFormatValidator(field_name='date1')])

答案 1 :(得分:0)

简单的解决方案:如果保存时发生错误,则记录数据。

class MyModel(models.Model):
     ...

     def save(self, *args, **kwargs):
          try:
               super(MyModel, self).save(*args, **kwargs)
          except Exception as e:
               log.error(self.date1, self.date2, self.date3)
               raise e

我还建议您使用django中的form或django-rest-framework中的Serializer类在保存之前检查数据。

答案 2 :(得分:0)

由于所有三个字段都属于同一类型,并且都期望使用相同的日期格式,并且验证将自上而下进行,因此错误很可能是由第一个字段引起的。

您可以通过使用首选格式在设置模块中设置日期输入格式变量来解决此问题。例如

  

DATE_INPUT_FORMATS = ['%Y-%m-%d','%m /%d /%Y','%m /%d /%y']

此处引用了更多受支持的格式Django project