私のビジネス モデルの一部では、特定のタイプのユーザーは特定の数を超える「もの」を作成できないことが規定されています。
いくつかの疑似コードで説明しましょう:
class Thing(Model):
owner = ForeignKey(User)
ユーザーがモノForm
を作成できないように、を検証する適切な場所はどこですか?nth + 1
私のビジネス モデルの一部では、特定のタイプのユーザーは特定の数を超える「もの」を作成できないことが規定されています。
いくつかの疑似コードで説明しましょう:
class Thing(Model):
owner = ForeignKey(User)
ユーザーがモノForm
を作成できないように、を検証する適切な場所はどこですか?nth + 1
clean()
フォームのメソッドに追加できます。
class ThingForm(forms.ModelForm):
def clean(self, *args, **kwargs):
cleaned_data = super(ThingForm, self).clean()
owner = cleaned_data.get("owner")
other_things_count = Things.objects.filter(owner=owner).count()
if other_things_count >= 20:
raise forms.ValidationError("Too many things!")
return cleaned_data
または、modelssave()
メソッドを上書きするか、で発生するシグナルをpre_save
作成することもできますが、どちらも検証メッセージをフォームに関連付けることができないため、上記の方法が最適だと思いますclean()
。
編集編集を除外する場合ModelForm
は、instance
に、つまり既存のオブジェクトがあるかどうかを確認できます。
other_things_count = Things.objects.filter(owner=owner).exclude(pk=self.instance.pk).count()
次の場所のいずれかで例外を発生させることを検討できます。
例外を発生させるサンプル コード:
if myThing.pk is None and myThing.owner.thing_set.count() > n:
# here raise your exception:
raise ValidationError("Too many things!")