Django:显示用户名而不是ID,怎么样?

时间:2013-02-15 14:28:03

标签: django django-rest-framework

我有以下序列化程序类。

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

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

非常感谢。

2 个答案:

答案 0 :(得分:6)

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

首先,您可以使用dotted.notation强制user字段的source argumentuser.username,而不是默认user

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=True添加到SlugField

答案 1 :(得分:3)

这个帖子已经过时了,但是由于我最近遇到了同样的问题,我想在其中添加现代答案。 我们必须像这样使用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')