1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Django】API画面で特定のフィールドを非表示にしたい!

Posted at

現在大学4回生の情報学科の学生です.

研究室での取り組みとしてWebアプリを作成しており,登録した複数のユーザ情報を表示する処理を書く際に,ユーザのパスワードだけは非表示にしたいと感じました.
フロント側の表示処理の部分で上手く解決しても良かったのですが,ハッシュ化されているとはいえ不必要なものをフロント側に送りたくなかったので,Django側で処理を完結させる方法を考えました.

本記事の概要

DjangoのAPI画面に表示させるフィールドの一部を非表示にするかつ,オブジェクト作成時にはそのフィールドに値を代入できる方法の説明しています.
要はパスワードなど一度登録したものをそのままブラウザで表示しないようにする方法です.

to_representationをオーバーライドする

BaseSerializerクラスに定義されているメソッドであるto_representationを再定義することで今回の問題は解決できます.

例として以下のようなUserクラスを考えます.

models.py
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画面で表示しないようにするには次のようにシリアライザを定義します.

serializers.py
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はフィールドとして表示されていないが,フォーム部分には存在している状態を作ることができます.

image.png

to_representationに関しては以下の記事で詳しく解説されていました.

上手くいかなかった例

単にserializers.pypasswordを明示的にフィールドに含めない方法も思いついたのですが,これではフォーム部分からもpasswordがなくなり,設定できなくなってしまいます.

serializers.py
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        # パスワードをフィールドに含めない
        fields = ['id', 'name', 'email']

以下のようにパスワードのフォームがなくなってしまう.
image.png

終わりに

Djangoで開発をしていると便利すぎて,細かい修正を行うときに大変です・・・

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?