【问题标题】:Django rest framework incorrect nested serializationDjango rest框架不正确的嵌套序列化
【发布时间】: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


【解决方案1】:

刚刚发现我犯了一个非常愚蠢的错误。为了得到正确的响应,我所要做的就是更换 views.py 文件中的return Response(serializer.data) 行到return Response({'info': serializer.data}) 行。

【讨论】:

    猜你喜欢
    • 2021-06-23
    • 2018-12-13
    • 2019-12-23
    • 1970-01-01
    • 2016-08-01
    • 2014-07-26
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多