現在大学4回生の情報学科の学生です.
研究室での取り組みとしてWebアプリを作成しており,登録した複数のユーザ情報を表示する処理を書く際に,ユーザのパスワードだけは非表示にしたいと感じました.
フロント側の表示処理の部分で上手く解決しても良かったのですが,ハッシュ化されているとはいえ不必要なものをフロント側に送りたくなかったので,Django側で処理を完結させる方法を考えました.
本記事の概要
DjangoのAPI画面に表示させるフィールドの一部を非表示にするかつ,オブジェクト作成時にはそのフィールドに値を代入できる方法の説明しています.
要はパスワードなど一度登録したものをそのままブラウザで表示しないようにする方法です.
to_representationをオーバーライドする
BaseSerializer
クラスに定義されているメソッドであるto_representation
を再定義することで今回の問題は解決できます.
例として以下のようなUserクラスを考えます.
class User(models.Model):
name = models.CharField(verbose_name='名前', max_length=255)
email = models.EmailField(verbose_name='メアド', max_length=255)
password = models.CharField(verbose_name='パスワード', max_length=255)
def __str__(self):
return self.name
このクラス内のpassword
フィールドをAPI画面で表示しないようにするには次のようにシリアライザを定義します.
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = '__all__'
def to_representation(self, instance):
representation = super().to_representation(instance)
# 非表示にしたいフィールドを削除
representation.pop('password', None)
return representation
上記コードのrepresentation
には取得したモデルのインスタンスのkeyとvalueが含まれており,非表示にしたいフィールドをpopすることで,その値を除いたデータを返しています.
こうすることで以下のAPI画面のように,password
はフィールドとして表示されていないが,フォーム部分には存在している状態を作ることができます.
to_representation
に関しては以下の記事で詳しく解説されていました.
上手くいかなかった例
単にserializers.py
でpassword
を明示的にフィールドに含めない方法も思いついたのですが,これではフォーム部分からもpassword
がなくなり,設定できなくなってしまいます.
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
# パスワードをフィールドに含めない
fields = ['id', 'name', 'email']
終わりに
Djangoで開発をしていると便利すぎて,細かい修正を行うときに大変です・・・