如何在Python/Django模型字段上强制使用正数?

如何在Python/Django模型字段上强制使用正数?,django,python-3.x,postgresql,model,numbers,Django,Python 3.x,Postgresql,Model,Numbers,我正在使用Django和Python 3.7。我也在使用Postgres9.6。我的模型中有以下字段 class ArticleStat(models.Model): ... score = models.FloatField(default=0, null=False) 是否有任何方法可以写入约束,以便在生成迁移时,基础数据库将强制执行始终等于或大于零的FloatField?我不希望这个字段中有任何负数。不幸的是,django中没有正数字段。但是你可以用 MinValueV

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

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

是否有任何方法可以写入约束,以便在生成迁移时,基础数据库将强制执行始终等于或大于零的FloatField?我不希望这个字段中有任何负数。

不幸的是,django中没有
正数字段。但是你可以用

MinValueValidator
code:

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.
注意:django验证不会自动运行。因此,您必须运行
obj.clean\u fields()
obj.clean()
。检查这个


如前所述,您应该使用:MinValueValidator。去检查一下,这并不能回答问题。这将应用验证器,但不会在数据库级别强制执行约束,至少不会对我使用的数据库类型执行约束。去看看吧,谢谢你提供的信息。根据我对另一个人的评论,我想知道是否有办法运行迁移并让PostGres强制实施positive约束。当我尝试添加MinValidator时,没有向PostGres表添加新的约束。Validator是django的逻辑,独立于数据库。正如我在回答中所说的,由于没有PositiveFlotField,所以通过django建立数据库将很困难@戴夫
class YourModel(models.Model):
    po_float = models.FloatField(validators=[MinValueValidator(0)]

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