Django:基于另一个 DateTimeField 验证 DateTimeField

Django: Validate DateTimeField based on another DateTimeField

提问人:davidcesarino 提问时间:9/24/2023 更新时间:9/25/2023 访问量:26

问:

我想在相同的模式下验证基于另一个,如下所示:DateTimeFieldDateTimeField

class Operation(models.Model):
    machine = models.ForeignKey(Machine, on_delete=models.CASCADE)
    start = models.DateTimeField(auto_now_add=True)
    end = models.DateTimeField(
        null=True,
        blank=True,
        validators=[
            MinValueValidator(start)
        ]
    )

我在开机自检时出现异常:TypeError

“datetime.datetime”和“DateTimeField”的实例之间不支持“<”

这些是变量:

一个 datetime.datetime(2023, 1, 10, 0, 25, 29, tzinfo=zoneinfo.区域信息(key='美国/Sao_Paulo'))

b <django.db.models.fields.DateTimeField: start>

self <django.core.validators.MinValueValidator 对象位于 0x104ded4d0>

我想我需要从字段中提取,但我似乎无法从模型验证器内部做到这一点。datetime.datetime

有什么提示吗?谢谢。

python django 验证 django-models

评论

1赞 McPherson 9/24/2023
模型的方法是您需要的,而不是字段验证器,因为 ut 允许您访问模型的字段。clean

答:

0赞 davidcesarino 9/24/2023 #1

对不起,愚蠢的我在午夜后尝试事情。无论如何,我只是用过,它起作用了。clean

0赞 ClanEver 9/24/2023 #2

因为验证者无法在多个字段之间进行比较。在代码中,in 表示整个字段,而不是单个实例的实际值。startMinValueValidator(start)

你需要 Model.clean()

class Operation(models.Model):
    machine = models.ForeignKey(Machine, on_delete=models.CASCADE)
    start = models.DateTimeField(auto_now_add=True)
    end = models.DateTimeField(null=True, blank=True)

    def clean(self):
        super().clean()
        if self.start and self.end:
            if self.start > self.end:
                raise ValidationError("End datetime must be greater than start datetime.")

我希望这会有所帮助。

评论

0赞 davidcesarino 9/25/2023
谢谢。是的,这就是为什么我在问完后几乎立即回答了自己的问题。有趣的是,我们如何搜索一个小时的答案,却在询问一分钟后才找到它。总是这样。