在django rest框架中加入相关模型

Sim*_*nko 5 python django django-rest-framework django-allauth

尝试创建用于获取用户配置文件的 API 方法。问题是有两个与用户相关的表:内置 djangoUserSocialAccount来自 allauth 框架。我想加入部分应该在序列化程序中,所以经过研究我想出了这个:

from rest_framework import serializers
from django.contrib.auth.models import User
from allauth.socialaccount.models import SocialAccount


class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('pk', 'first_name', 'last_name')


class SocialSerializer(serializers.ModelSerializer):
    user = UserSerializer(many=False, read_only=True)

    class Meta:
        model = SocialAccount
        fields = ('uid', 'provider', 'user')
Run Code Online (Sandbox Code Playgroud)

它可以工作,但将其输出为嵌套对象:

{
  "uid": "",
  "provider": "",
  "user": {
    "pk": 5,
    "first_name": "",
    "last_name": ""
  }
}
Run Code Online (Sandbox Code Playgroud)

我希望它是一个对象:

{
  "uid": "",
  "provider": "",
  "pk": 5,
  "first_name": "",
  "last_name": ""
}
Run Code Online (Sandbox Code Playgroud)

Kry*_*ček 3

您可以尝试展平 JSON(请参阅此链接)或重新定义序列化器,如下所示:

class SocialSerializer(serializers.ModelSerializer):
    pk = serializers.SerializerMethodField()
    first_name = serializers.SerializerMethodField()
    last_name = serializers.SerializerMethodField()

    class Meta:
        model = SocialAccount
        fields = ('uid', 'provider', 'pk', 'first_name', 'last_name')

    def get_pk(self, obj):
        return obj.user.pk

    def get_first_name(self, obj):
        return obj.user.first_name

    def get_last_name(self, obj):
        return obj.user.last_name
Run Code Online (Sandbox Code Playgroud)

这些serializers.SerializermethodField()字段将查看get_<field_name>方法并调用它们并使用返回值。

http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield