在序列化器中获取字段的属性(django rest 框架)

Getting attribute of field in serializer (django rest framework)

serializers.py

from django.contrib.auth.models import User
from engine.models import Game
from rest_framework import serializers

class GameSerializer(serializers.ModelSerializer):
    class Meta:
        model = Game
        fields = (
            'game_name',
            'level',
            'game_type',
            'creator',
            'id',
        )

我想得到 creator.username 作为 creator 只是 returns 作为创建者的用户对象的 ID 的整数。我怎样才能得到 creator.username 而不是创作者?

试试这个。希望 creator 字段是只读的,并从像 request.user

这样的视图中分配
from django.contrib.auth.models import User
from engine.models import Game
from rest_framework import serializers

class GameSerializer(serializers.ModelSerializer):
    creator = serializers.CharField(read_only=True, source='creator.username')
    class Meta:
        model = Game
        fields = (
            'game_name',
            'level',
            'game_type',
            'creator',
            'id',
        )

注意: 这将使 creator 字段变为只读。如果您打算从序列化程序中添加它,请为 creator.user 名称使用单独的名称。就像下面的例子

class GameSerializer(serializers.ModelSerializer):
    creator_name = serializers.CharField(read_only=True, source='creator.username')
    class Meta:
        model = Game
        fields = (
            'game_name',
            'level',
            'game_type',
            'creator',
            'creator_name',
            'id',
        )

您可以如下重写序列化程序方法字段以获取 creator.username 作为 creator,如下所示:

class GameSerializer(serializers.ModelSerializer):
    creator = serializers.SerializerMethodField(read_only=True)

    def get_creator(self, obj):
        # obj is model instance
        return obj.creator.username

    class Meta:
        model = Game
        fields = (
            'game_name',
            'level',
            'game_type',
            'creator',
            'id',
        )