【问题标题】:How do I enforce a positive number on my Python/Django model field?如何在我的 Python/Django 模型字段上强制使用正数?
【发布时间】:2019-07-18 09:07:15
【问题描述】:

我正在使用 Django 和 Python 3.7。我也在使用 Postgres 9.6。我的模型中有以下字段。

class ArticleStat(models.Model):
    ...
    score = models.FloatField(default=0, null=False)

有没有办法编写约束,以便在生成我的迁移时,底层数据库将强制执行始终等于或大于零的FloatField?我不希望该字段中有任何负数。

【问题讨论】:

  • 正如已经回答的here,您应该使用:MinValueValidator。去看看吧。
  • 这不能回答问题。这应用了验证器,但没有做任何事情来在数据库级别强制执行约束,至少不是我正在使用的数据库类型。去看看吧。

标签: python django postgresql model numbers


【解决方案1】:

很遗憾,Django 中没有PositiveFloatField,但你可以使用MinValueValidator

MinValueValidatorimplemented like this

class MinValueValidator(BaseValidator):
    message = _('Ensure this value is greater than or equal to %(limit_value)s.')
    code = 'min_value'

    def compare(self, a, b):
        return a < b  # super simple.

将验证器附加到您的浮点字段。

class YourModel(models.Model):
    po_float = models.FloatField(validators=[MinValueValidator(0)]

m = YourModel(po_float=-1)
m.clean_fields()  # raise ValidationError

注意:Django 验证不会自动运行。所以你必须运行obj.clean_fields()obj.clean()。检查this doc

【讨论】:

  • 感谢您提供此信息。根据我对另一个人的评论,我想知道是否有办法运行迁移并让 PostGres 强制执行正向约束。当我尝试添加 MinValidator 时,没有新的约束被添加到 PostGres 表中。
  • Validator是django的逻辑,独立于数据库。正如我在答案中所说,由于没有 PositiveFlotField,因此很难通过 django 设置数据库。 @戴夫
  • 这包括 0.0,对吧? (大于或等于) - 你将如何强制它大于 0?
猜你喜欢
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 2017-10-21
  • 2016-03-31
  • 2016-09-11
  • 1970-01-01
相关资源
最近更新 更多