djangorest框架序列化器返回名称不是整数

who*_*rth 2 django django-rest-framework

我正在做一个简单的列表视图,其中当前返回如下所示 -

[
    {
        "name": "John",
        "description": "John's Group",
        "owner": 1
    }
]
Run Code Online (Sandbox Code Playgroud)

问题是我不想要那个整数,我希望它像这样显示 -

[
    {
        "name": "John",
        "description": "John's Group",
        "owner": "John Smith"
    }
]
Run Code Online (Sandbox Code Playgroud)

我发现的解决这个问题的唯一方法是做一个像这样的序列化器 -

class ClassListSerializer(serializers.ModelSerializer):
    ownername = serializers.CharField(source='owner.username')
    class Meta:
        model=ClassList
        fields = ('name', 'description', 'ownername')
Run Code Online (Sandbox Code Playgroud)

问题是我不想将该字段更改为ownername.

在模型中设置以下内容适用于模型的传统查询 -

def __str__(self):
    return self.username
Run Code Online (Sandbox Code Playgroud)

但我猜因为 DRF 的读取方式不同,它不遵守外键映射并返回?

这样做是行不通的,因为它试图覆盖已经存在的内容owner-owner

class ClassListSerializer(serializers.ModelSerializer):
    owner = serializers.CharField(source='owner.username')
    class Meta:
        model=ClassList
        fields = ('name', 'description', 'owner')
Run Code Online (Sandbox Code Playgroud)

那么如何让它显示名称而不是整数呢?

Lin*_*via 5

SlugRelatedField正是您正在寻找的:

class ClassListSerializer(serializers.ModelSerializer):
    owner = serializers.SlugRelatedField(
        slug_field='username',
        queryset=User.objects.all())
    class Meta:
        model=ClassList
        fields = ('name', 'description', 'owner')
Run Code Online (Sandbox Code Playgroud)