在序列化程序中获取字段的属性(Django Rest框架)

Mik*_*son 2 django django-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',
        )
Run Code Online (Sandbox Code Playgroud)

我想creator.usernamecreator刚刚返回用户对象,它是创作者的ID的整数。如何获取creator.username而不是creator?

Ane*_*R S 5

尝试这个。希望该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',
        )
Run Code Online (Sandbox Code Playgroud)

注意: 这将使该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',
        )
Run Code Online (Sandbox Code Playgroud)


Gah*_*han 5

您可以覆盖串行方法字段如下得到creator.usernamecreator如下:

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',
        )
Run Code Online (Sandbox Code Playgroud)