【问题标题】:Django set range for integer model field as constraintDjango将整数模型字段的范围设置为约束
【发布时间】:2016-02-19 18:27:18
【问题描述】:

我有一个 django 模型,

class MyModel(models.Model)
    qty = model.IntegerField()

我想为qty 设置约束,>0 或 qty 可以是负数或正数但不能为0。

在 Django 中是否有任何直接的方法可以做到这一点?

【问题讨论】:

  • 您必须创建一个自定义验证器

标签: python django django-models


【解决方案1】:

从 Django 2.2 开始,您可以使用 CheckConstraint 在数据库级别强制执行约束:

from django.db import models

class MyModel(models.Model)
    qty = model.IntegerField()

    class Meta:
        constraints = [
            models.CheckConstraint(
                check=models.Q(qty__gte=1) & models.Q(qt__lte=10),
                name="A qty value is valid between 1 and 10",
            )
        ]

【讨论】:

    【解决方案2】:

    如果您使用的是 postgres,则可以使用范围字段来指定范围。 检查这个:Range Fields in django

    【讨论】:

    • 您指的是它用于存储范围的字段,但问题是关于约束,它限制了范围内的字段值
    【解决方案3】:

    你可以使用Django's built-in validators -

    from django.db import models
    from django.core.validators import MaxValueValidator, MinValueValidator
    
    class MyModel(models.Model):
        qty = models.IntegerField(
            default=1,
            validators=[MaxValueValidator(100), MinValueValidator(1)]
         )
    

    注意:当您保存模型时,验证器不会自动运行,但如果您使用的是 ModelForm,它将在表单中包含的字段上运行您的验证器。查看此link 了解更多信息。

    【讨论】:

    【解决方案4】:

    您必须创建一个自定义验证器

    from django.core.exceptions import ValidationError
    
    def validate_number(value):
        if something :  # Your conditions here
            raise ValidationError('%s some error message' % value)
    

    然后在你的模型中使用这个验证器

    from django.db import models
    
    class MyModel(models.Model):
        field = models.IntegerField(validators=[validate_number])
    

    【讨论】:

      猜你喜欢
      • 2019-11-01
      • 2011-08-25
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      • 2010-10-18
      • 2020-10-09
      相关资源
      最近更新 更多