首页 > 解决方案 > Django:如何根据外键属性设置整数字段最大值?

问题描述

我有以下模型:

class Atividades_cumpridas(models.Model):
    id_atividade = models.ForeignKey(Atividade, on_delete=models.CASCADE)
    id_jogador = models.ForeignKey(Jogador, on_delete=models.CASCADE)
    pontos_xp_ganhos = models.IntegerField()

    def __str__(self):
        str = self.id_atividade.nome_atividade + ' - ' + self.id_jogador.nome_jogador
        return str

我想设置pntos_xp_ganhos基于的最大值Atividade.pontos_XP_maximo。我该如何做到这一点并在管理员编辑页面上显示最大值?

标签: djangowebdjango-modelsdjango-formsdjango-admin

解决方案


有两种方法可以做到,

  1. 使用自定义验证器
  2. 使用内置验证器

自定义验证器:

from django.core.exceptions import ValidationError

def validate_range(value):
    if value > Atividade.pontos_XP_maximo:
        raise ValidationError('Max value should be %s' % Atividade.pontos_XP_maximo
        )

class Atividades_cumpridas(models.Model):
        ...
        ...
        pontos_xp_ganhos = models.IntegerField(validators=[validate_range])

使用内置验证器:

MIN = 0
MAX = Atividade.pontos_XP_maximo
from django.core.validators import MinValueValidator, MaxValueValidator

class Atividades_cumpridas(models.Model):
    ...
    ...
    pontos_xp_ganhos = models.IntegerField(validators=[MinValueValidator(MIN), MaxValueValidator(MAX)]

推荐阅读