代码之家  ›  专栏  ›  技术社区  ›  ThunderHorn

Django型号从到

  •  1
  • ThunderHorn  · 技术社区  · 6 年前

    age_from = models.IntegerField(blank=True, null=True, verbose_name='Age min.')
    age_to = models.IntegerField(blank=True, null=True, verbose_name='Age max')
    

    我希望我的年龄大于或等于

    1 回复  |  直到 6 年前
        1
  •  2
  •   willeM_ Van Onsem    6 年前

    您可以在Django中为模型指定一些约束,但是执行这些约束(例如在ORM中)非常困难。下面两种方法。

    通过使用 .clean() 方法

    通过重写 clean(..) 函数,但请注意,默认情况下- 在模型/ORM层实施, Form 清洁(…) 函数,从而引发异常。

    class MyModel(models.Model):
    
        def clean(self):
            a1 = self.age_from
            a2 = self.age_to
            if a1 is not None and a2 is not None and a1 > a2:
                raise ValidationError('age_from should be less than or equal to age_to')
            super().clean()

    所以这检查如果两列都是非- None ,那个 age_from 小于或等于 age_to

    django-db-constraints

    您还可以在数据库级别强制执行约束,因为您的数据库系统支持这一点,例如 django-db-constraints [GitHub]

    然后可以添加约束,如:

    class MyModel(models.Model):
    
        class Meta:
            db_constraints = {
                'age_check': 'CHECK (age_from IS NULL OR age_to IS NULL OR age_from <= age_to)',
            }