【问题标题】:Join related models in django rest framework在 django rest 框架中加入相关模型
【发布时间】:2018-07-21 04:00:18
【问题描述】:

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

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')

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

{
  "uid": "",
  "provider": "",
  "user": {
    "pk": 5,
    "first_name": "",
    "last_name": ""
  }
}

我希望它成为一个对象:

{
  "uid": "",
  "provider": "",
  "pk": 5,
  "first_name": "",
  "last_name": ""
}

【问题讨论】:

标签: python django django-rest-framework django-allauth


【解决方案1】:

您可以尝试扁平化 JSON(请参阅 this link)或重新定义您的序列化程序,如下所示:

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

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

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

【讨论】:

  • 最佳答案。
【解决方案2】:

或者,试试

class SocialSerializer(serializers.ModelSerializer):
    user = UserSerializer()

    class Meta:
        model = SocialAccount
        fields = ('uid', 'provider', 'user')

    def to_representation(self, instance):
        data = super(SocialSerializer, self).to_representation(instance)
        user = data.pop('user')
        for key, val in user.items():
            data.update({key: val})
        return data

【讨论】:

    猜你喜欢
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2020-12-24
    • 1970-01-01
    • 2017-03-27
    • 2018-12-10
    • 2017-02-04
    相关资源
    最近更新 更多