Python,Django:limitintegerfieldinmodels.py

2024-05-19 23:03:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我想问一下,与另一个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)])

如您所见,活动的端口与端口相关!?是否可以限制端口\u活动字段,使其只能小于或等于,但不能大于端口

谢谢你的帮助,祝你度过愉快的一天


1条回答
网友
1楼 · 发布于 2024-05-19 23:03:08

您可以向模型中添加^{} [Django-doc]以在数据库端强制执行此操作(如果数据库支持此操作),此外,您还可以覆盖^{} method [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'
            )
        ]

相关问题 更多 >