Django模型字段验证器没有按应有的方式引发异常

2024-06-25 22:31:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我在models.py中有以下模型:

@python_2_unicode_compatible
class Session(ModelCommon): # ModelCommon is an abstract Model which extends from models.Model with the fields name(CharField) and enabled(BooleanField).
    """
    Model Session with foreign key to Model Event.
    """
    event = models.ForeignKey(verbose_name=_('Event'), to=Event, default=None, null=False, blank=False)
    start_datetime = models.DateTimeField(verbose_name=_('Session Starts'), default=None, null=False, blank=False)
    end_datetime = models.DateTimeField(verbose_name=_('Session Ends'), default=None, null=False, blank=False)
    available = models.BooleanField(verbose_name=_('Available'), default=True, null=False, blank=False)
    price = models.DecimalField(verbose_name=_('Price'), max_digits=10, decimal_places=2,
                                validators=[MinValueValidator(0.00)],
                                default=None, null=False, blank=False)

当我测试我的模型时,如果price为负数,则不应将其保存在数据库中,它不会像它应该的那样引发异常。在

test_models.py

^{pr2}$

最后,当我运行我的test_models.py时,我得到以下消息:

Failure
Traceback (most recent call last):
    self.assertRaises(Exception, lambda: self.session.save())
AssertionError: Exception not raised

Tags: namepy模型noneeventfalsedefaultverbose
1条回答
网友
1楼 · 发布于 2024-06-25 22:31:53

调用save()不会触发验证。有关更多信息,请参阅validating objects上的Django文档。您可以改为调用full_clean。在

self.session.price = -20.0
self.assertRaises(Exception, lambda: self.session.full_clean())

注意,您可以从代码中删除lambda并传递callable。捕捉更具体的ValidationError而不是{},这也会更好。在

^{pr2}$

相关问题 更多 >