4

次のシリアライザークラスがあります。

class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = ('id', 'name', 'active', 'type', 'user')

すべてのプロファイルを一覧表示すると、ユーザー フィールドにユーザー ID が表示されます。これを変更して user.username を表示するにはどうすればよいですか? 私は自分のモデルでこれをメタクラスに追加するだけであることを知っていますが、ユーザーモデル (Django の一部) は作成しませんでした。ユーザーを呼び出すときに、IDではなくユーザー名を表示するようにDjangoに指示するにはどうすればよいですか?

どうもありがとう。

4

2 に答える 2

8

これに対処できる2つの明白な方法:

まず、を使用して、フィールドのソース引数をデフォルトの代わりにdotted.notation強制することができます。useruser.usernameuser

class ProfileSerializer(serializers.ModelSerializer):
    user = serializers.Field(source='user.username')

    class Meta:
        model = Profile
        fields = ('id', 'name', 'active', 'type', 'user')

これFieldは標準の読み取り専用フィールドであるため、このシリアライザーを使用してユーザーを更新することはできません。

または、ユーザーを書き込み可能なフィールドにする場合は、次のようにSlugRelatedFieldを使用できます...

class ProfileSerializer(serializers.ModelSerializer):
    user = serializers.SlugRelatedField(slug_field='username')

    class Meta:
        model = Profile
        fields = ('id', 'name', 'active', 'type', 'user')

必要に応じて、2番目のアプローチを使用することもできますが、に追加read_only=Trueすることにより、読み取り専用フィールドを使用しますSlugField

于 2013-02-15T15:55:41.870 に答える
5

このスレッドは古いですが、最近同じ問題に遭遇したので、最新の回答を追加したいと思います。次のように、DRF の組み込み SerializerMethodField() を使用する必要があります。

class ProfileSerializer(serializers.ModelSerializer):
  user = serializers.SerializerMethodField()

  def get_user(self, obj):
      return obj.user.username

  class Meta:
      model = Profile
      fields = ('id', 'name', 'active', 'type', 'user')
于 2017-10-19T21:20:51.483 に答える