イベント(ソフトボールゲーム)をスケジュールし、より大きなチーム名簿からゲーム名簿を作成できるモデルを設計しようとしています。
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)
ここまでは順調ですね。ただし、プレーヤーの多対多フィールドにカスタム検証を追加して、ゲーム名簿が、とりわけ、名簿の最小サイズと最大サイズに関するリーグルールに準拠するようにします。
次の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のドキュメントをざっと見て、有望に見えるいくつかのことを試しましたが、何も機能しませんでした。