次のような Django モデルがいくつかあります (これは私の正確なコードではありませんが、同じ構造を持つ単純な例です)。
class Player(models.Model):
# Some fields here.
pass
class Team(models.Model):
players = models.ManyToManyField(Player, through='TeamPlayer')
class TeamPlayer(models.Model):
team = models.ForeignKey(Team)
player = models.ForeignKey(Player)
some_other_field = models.BooleanField()
through
リンクテーブルに余分な列があるため、このメカニズムを使用しています。
私の管理者クラスは次のようになります (プレーヤーを追加するためにインライン管理者を使用していることに注意してください)。
class TeamPlayerInline(admin.TabularInline):
model = TeamPlayer
max_num = 11
extra = 11
class TeamAdmin(admin.ModelAdmin):
inlines = [TeamPlayerInline]
admin.site.register(Team, TeamAdmin)
質問: 私の問題は、私の管理画面で、チームにちょうど 11 人のプレーヤーがいるということを検証したいということです。これより少ないとエラーになります。これどうやってするの?
これらは私が試したことと、それらが機能しなかった理由です。
モデルの
clean
メソッドでプレイヤーの数を検証します。Team
プレイヤーがまだ保存されていないため、これは機能しません。したがって、新しいオブジェクトの場合、プレイヤーは常にゼロです。によって使用される
clean_players
a のメソッドで数値を検証します。このメソッドは呼び出されません。他の非 ManyToMany フィールドの同様のメソッドが呼び出されます。ModelForm
TeamAdmin
clean
前述の方法で番号を検証しModelForm
ます。このメソッドが呼び出されますが、self.cleaned_data
辞書には のエントリがありません'players'
。
このタイプの検証を達成する方法はありますか? 私は Django の専門家ではありませんので、当然のことをすべて実行したとは思わないでください。