address
テーブルがあり、フィールドがあるとしpostal_code
ます。ModelChoiceFieldでは、PK以外のものを使用して存在が正しいことを検証できませんか?行く方法は何でしょうか?通常の入力と使用clean_*()
?
3 に答える
どうto_field_name
ですか?どこかに文書化されているかどうかはわかりませんが、ModelChoiceField
コンストラクターパラメーター間で簡単に見つけることができます:https ://github.com/django/django/blob/master/django/forms/models.py 。フィールドクエリセットをフィルタリングするために使用されます。
例えば:
articles = ModelChoiceField(queryset=Articles.objects.all(),
to_field_name='slug')
ModelChoiceFields は、既存のモデル インスタンスの選択肢の中から選択するために使用することを意図しています。これはほとんどの場合、なんらかの形式の Select フィールドで表すのが最適です。
つまり、あなたが暗示しているように、実際に address から postal_code への FK がありますか。住所関連のクエリごとに結合する必要がある余分なテーブルを正当化するために、PostalCode テーブルに何を格納していますか?
ほとんどの場合、postal_code は単純に CharField にする必要があります。その場合、値が有効であることを検証したい場合はchoices
、有効な郵便番号のリストで属性を使用できます。有効な郵便番号のリストを手動で管理するのは非常に面倒なことです。
実際に PostalCode テーブルがあり、それが良い考えだと思う場合 (場合によってはそうなる可能性があります)、postal_code をデフォルトの自動インクリメントではなく主キーとして実際に使用することを検討することをお勧めします。 、検証で問題を解決します。
が有効な郵便番号を含む PostalCode モデルへの外部キーである場合postal_code
は、CharField を使用してから、提案したようにクリーンアップします。私のきれいな方法は次のようになります:
def clean_postal_code(self):
try:
code = PostalCode.objects.get(code_field=self.data['postal_code'])
except:
raise forms.ValidationError("Please enter a valid postal code")
return code