【发布时间】:2020-08-05 13:14:53
【问题描述】:
我开始了一个新的 django rest 框架项目并遇到了一个烦人的问题。嵌套序列化无法按预期工作。除了默认的“属性”json 字段之外,它还返回一个额外的“关系”字段,而不是序列化关系模型并返回序列化对象。
这是我的 python 3.6 代码:
models.py
from django.db import models
from django.contrib.auth.models import User
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, verbose_name='User', null=True, blank=True)
first_name = models.CharField('First name', max_length=50)
last_name = models.CharField('Last name', max_length=50)
phone_number = models.CharField('Phone number', max_length=15)
activated = models.DateTimeField('Activated')
def __str__(self):
return f'<Profile {self.first_name.title()} {self.last_name.title()}>'
serializers.py
from rest_framework import serializers
from .models import Profile
from django.contrib.auth.models import User
class ProfileSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Profile
fields = ('id', 'first_name', 'last_name', 'phone_number')
class UserSerializer(serializers.ModelSerializer):
profile = ProfileSerializer()
class Meta:
model = User
fields = ('id', 'email', 'username', 'profile')
views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from django.contrib.auth.models import User
from .serializers import UserSerializer
from .models import Profile
class UserViews(APIView):
def get(self, request, format=None):
users = User.objects.all()
serializer = UserSerializer(users, many=True)
return Response(serializer.data)
我期望得到的答案:
{
"data": [
{
"type": "UserViews",
"id": "1",
"attributes": {
"email": "",
"username": "admin",
"profile": {
"id": 1,
"first_name": "name1",
"last_name": "name2",
"phone_number": "+79999999999",
}
},
}
]
}
我实际得到的:
{
"data": [
{
"type": "UserViews",
"id": "1",
"attributes": {
"email": "",
"username": "admin"
},
"relationships": {
"profile": {
"data": {
"type": "Profile",
"id": "1"
}
}
}
}
]
}
有什么问题,我该如何解决?我从我以前的项目中复制了这段代码,那里一切正常。提前谢谢大家。
【问题讨论】:
-
您提供的代码不会返回您发布的结果。您在编写问题时删除了损坏的代码,因此我们无能为力。
-
不,我没有删除任何东西。使用提供的代码,结果仍然不正确。
-
默认情况下,您与代码匹配的响应是:
[{"id": "1", "email": "", "username": "admin", "profile": {"id": "1", "first_name": "name1", "last_name": "name2", "phone_number": "+79999999999"}}]也许您安装了一些第三方来重写响应,但您提供的不是 django rest 框架默认响应。 -
是的,你是对的。它是 views.py 文件,而不是序列化程序。
标签: python json django serialization django-rest-framework