Sim*_*nko 5 python django django-rest-framework django-allauth
尝试创建用于获取用户配置文件的 API 方法。问题是有两个与用户相关的表:内置 djangoUser和SocialAccount来自 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)
您可以尝试展平 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
| 归档时间: |
|
| 查看次数: |
2876 次 |
| 最近记录: |