首页 > 解决方案 > Python,Django:在 models.py 中限制 IntegerField

问题描述

我想问一下,与另一个相比,是否可以在我的模型类中限制一个 IntegerField!?例如:

模型.py

class Example(models.Model):
    name = models.CharField(max_length=50, null=False, blank=False, unique=True)
    ports = models.IntegerField(default=1, validators=[MinValueValidator(1), MaxValueValidator(50)])
    ports_active = models.IntegerField(default=0, validators=[MinValueValidator(0), MaxValueValidator(50)])

如您所见,ports_active端口有关!?是否可以限制ports_active -field,使其只能小于或等于,但不能大于ports

感谢您的帮助,祝您有美好的一天!

标签: pythondjangodjango-models

解决方案


您可以在模型中添加CheckConstraint[Django-doc]以在数据库端强制执行此操作(如果数据库支持此操作),此外,您可以覆盖.clean(…)方法 [Django-doc]以在 Django/Python 级别验证此操作:

from django.core.exceptions import ValidationError
from django.db.models import F, Q

class Example(models.Model):
    name = models.CharField(max_length=50, null=False, blank=False, unique=True)
    ports = models.IntegerField(
        default=1,
        validators=[MinValueValidator(1), MaxValueValidator(50)]
    )
    ports_active = models.IntegerField(
        default=0,
        validators=[MinValueValidator(0), MaxValueValidator(50)]
    )
    
    def clean(self):
        if self.ports_active > self.ports:
            raise ValidationError('ports active should be less than or equal to ports')
        return super().clean()
    
    class Meta:
        constraints = [
            models.CheckConstraint(
                check=Q(ports__gte=F('ports_active')),
                name='ports_gte_to_ports_active'
            )
        ]

推荐阅读