4

我有以下序列化程序类。

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

列出所有配置文件时,用户字段会显示用户 ID。如何更改它以显示 user.username?我知道我的模型只是将它添加到我的元类中,但没有创建用户模型(它是 Django 的一部分)。调用用户时如何告诉 Django 显示用户名而不是 id?

非常感谢。

4

2 回答 2

8

两种明显的方法可以解决这个问题:

首先,您可以使用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')

如果您愿意,您也可以使用第二种方法,但使用只读字段,方法是添加read_only=TrueSlugField.

于 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 回答