我正在尝试设计一个模型,允许我安排活动(垒球游戏)并从更大的团队名单中创建游戏名单:
class Game(models.Model):
DateTime = models.DateTimeField()
opponent = models.CharField(max_length = 50, default="TBD")
players = models.ManyToManyField(Player, limit_choices_to={'id__in': Player.objects.filter(active='True')},blank=True)
到目前为止一切顺利。但是我也希望为玩家ManyToMany字段添加一些自定义验证,以便游戏名单符合关于最小和最大名单大小的联盟规则等等。
当我调用以下clean()方法时,我得到一个返回的ValueError('Game'实例需要有一个主键值才能使用多对多关系。):
def clean(self, *args, **kwargs):
from django.core.exceptions import ValidationError
#self.save()
players_count = self.players.count()
# Don't allow rosters with fewer than 9 players
if players_count < 9:
raise ValidationError('Rosters must have at least 9 players')
如果我插入已注释掉的self.save,验证器可以正常工作,但最终会有多个游戏条目。
我是新手 - 这是我的第一个非教程Django项目 - 所以我猜这是一个相当简单的答案。我在这里和Django文档中搜索并尝试了一些看起来很有前景的东西,但没有任何效果。
答案 0 :(得分:0)
在clean方法中,您只想进行验证检查。因此,首先保存它将是一个坏主意。因此,从表单对象中,您可以获取players字段的值并对其运行验证。当您覆盖表单清理方法时,请记得返回cleaning_data。
def clean(self, *args, **kwargs):
from django.core.exceptions import ValidationError
players = self.cleaned_data.get('players', [])
players_count = len(players):
# Don't allow rosters with fewer than 9 players
if players_count < 9:
raise ValidationError('Rosters must have at least 9 players')
return self.cleaned_data