限制外键数量

时间:2014-07-05 12:02:22

标签: django django-models

我们来看这个例子:

class Team (models.Model):
    name = models.CharField('Name', max_length=30)

class Round (models.Model):
    round_number = models.IntegerField('Round', editable=False) #Auto-incrementing per Team
    team = models.ForeignKey(Team)

限制为3轮。如何在管理员内部引发错误并且通常会阻止团队进行超过3次的回合?

3 个答案:

答案 0 :(得分:4)

通常你需要覆盖表格:

class RoundAdminForm(forms.ModelForm):
    def clean_team(self):
        team = self.cleaned_data['team']
        if team.round_set.exclude(pk=self.instance.pk).count() == 3:
            raise ValidationError('Max three rounds allowed!')
        return team

class RoundAdmin(admin.ModelAdmin):
    form = RoundAdminForm

如果在Round的更改表单页面中内联编辑了Team,则可以限制RoundInline的{​​{3}}。

答案 1 :(得分:2)

我喜欢使用验证器的方式:

def restrict_amount(value):
    if Round.objects.filter(team_id=value).count() >= 3:
        raise ValidationError('Team already has maximal amount of rounds (3)')


class Team (models.Model):
    name = models.CharField('Name', max_length=30)


class Round (models.Model):
    round_number = models.IntegerField('Round', editable=False) #Auto-incrementing per Team
    team = models.ForeignKey(Team, validators=(restrict_amount, ))

使用验证器将使Django正确处理它,例如,在管理面板中显示错误。

答案 2 :(得分:0)

执行此操作的最佳方法是重写save()方法,如果不满足条件,则会出错。从前端和重写save()方法的一个限制仅适用于后端验证。