Python Django Rest框架,更新嵌套序列化数据

Python Django Rest框架,更新嵌套序列化数据,python,django,serialization,django-rest-framework,Python,Django,Serialization,Django Rest Framework,我不熟悉使用Django Rest框架和序列化数据,我试图更新嵌套序列化程序,但遇到了问题,我环顾四周,但大多数人在serializers.py方面都有问题,而我甚至无法在没有错误的情况下进入def update,以下是我的类: 视图.py from django.shortcuts import render from rest_framework import generics from api.serializers import ProfileSerializer from django

我不熟悉使用Django Rest框架和序列化数据,我试图更新嵌套序列化程序,但遇到了问题,我环顾四周,但大多数人在serializers.py方面都有问题,而我甚至无法在没有错误的情况下进入def update,以下是我的类:

视图.py

from django.shortcuts import render
from rest_framework import generics
from api.serializers import ProfileSerializer
from django.contrib.auth.models import User
from api.models import Profile
from django.http import JsonResponse

class ProfileView(generics.ListCreateAPIView):
    def get(self, request):
        profile = Profile.objects.filter(user_id=request.user.id)
        serializer = ProfileSerializer(profile, many=True)
        return JsonResponse(serializer.data, safe=False)
    def post(self, request, *args, **kwargs):
        profile = Profile.objects.filter(user_id=request.user.id)
        data = request.POST
        serializer = ProfileSerializer(profile, data=data, partial=True)
        if serializer.is_valid():
            serializer.save()
        else:
            print(serializer.errors)
        return JsonResponse(serializer.data, safe=False)
from rest_framework import serializers
from django.contrib.auth.models import User
from api.models import Profile

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id','username','first_name','last_name','email','last_login','date_joined','is_active')

class ProfileSerializer(serializers.ModelSerializer):
    user = UserSerializer()
    class Meta:
        model = Profile
        fields = ('id','phone','birth_date','user')

        def update(self, instance, validated_data):
            #Cant get here
            print("hey")
            return instance
序列化程序.py

from django.shortcuts import render
from rest_framework import generics
from api.serializers import ProfileSerializer
from django.contrib.auth.models import User
from api.models import Profile
from django.http import JsonResponse

class ProfileView(generics.ListCreateAPIView):
    def get(self, request):
        profile = Profile.objects.filter(user_id=request.user.id)
        serializer = ProfileSerializer(profile, many=True)
        return JsonResponse(serializer.data, safe=False)
    def post(self, request, *args, **kwargs):
        profile = Profile.objects.filter(user_id=request.user.id)
        data = request.POST
        serializer = ProfileSerializer(profile, data=data, partial=True)
        if serializer.is_valid():
            serializer.save()
        else:
            print(serializer.errors)
        return JsonResponse(serializer.data, safe=False)
from rest_framework import serializers
from django.contrib.auth.models import User
from api.models import Profile

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id','username','first_name','last_name','email','last_login','date_joined','is_active')

class ProfileSerializer(serializers.ModelSerializer):
    user = UserSerializer()
    class Meta:
        model = Profile
        fields = ('id','phone','birth_date','user')

        def update(self, instance, validated_data):
            #Cant get here
            print("hey")
            return instance
样本结构

[
    {
        "id": 3,
        "phone": "XXXXXX",
        "birth_date": "2017-06-29",
        "user": {
            "id": 1,
            "username": "xxxxx",
            "first_name": "XXXXX",
            "last_name": "XXXX",
            "email": "xxxxxxx@gmail.com",
            "last_login": "2017-06-29T15:16:11.438818Z",
            "date_joined": "2017-06-23T16:48:38Z",
            "is_active": true
        }
    }
]
我当前的错误: (发布数据:电话=0000000)


谢谢大家!

您看到此错误是因为您将queryset而不是实例传递给序列化程序
\uuuu init\uuuu
。要解决此错误,请更改以下内容:

def post(self, request, *args, **kwargs):
    profile = Profile.objects.filter(user_id=request.user.id)
为此:

def post(self, request, *args, **kwargs):
    profile = Profile.objects.get(user_id=request.user.id)
换句话说,您需要由
get
返回的概要文件实例,而不是由
filter
返回的queryset

UPD

要更新嵌套用户,请尝试以下操作(未测试,如果有任何错误,请告诉我):


我发现自己处于类似的情况,我能够解决如下问题。希望能有所帮助

def update(self, instance, validated_data):
    user_data = validated_data.pop('user')
    user_serializer = UserSerializer()
    super(self.__class__, self).update(instance,validated_data)
    super(UserSerializer,user_serializer).update(instance.user,user_data)
    return instance

我遇到了一个类似的问题,并使用变通方法解决了它。首先让我解释一下我的情况。当在JS页面上按下SUBMIT按钮时,它将触发REST API,该API将现有DB项的计数增加1。因此,我将传入JSON请求的内容解析为一个变量,比如a。但由于该变量是不可变的,因此我创建了一个新变量,比如X,然后以一种可以发送到可序列化类的格式添加值,如下所示:-
X={'item_name':A[“item_name”],'count_of_vows':last_count+1}
然后
serializer\u class\u Object=serializer\u class(现有的\u Object\u ref,data=X)

Awesome!这适用于正常更新,我可以更改上层(电话)的数据,但您能帮我更新嵌套集的数据吗?(例如更改用户名)我尝试发布
user.email=something
,但出现以下错误
默认情况下.update()方法不支持可写嵌套字段。
那么我如何编写自定义更新方法来实现这一点?谢天谢地,againI仍然收到相同的错误,看起来它会工作,但我似乎根本没有进入该函数,当我发布数据时,它会尝试默认更新而不是自定义更新,我是否需要在视图中使用.update()或其他什么来指定它?@Amirgem哦,我明白了,从元类中删除更新。这应该直接在序列化程序类中,一个与Meta相同级别的类。我正要键入这是一个错误,哈哈,永远不要感谢!!我想在更新时将数据显示到字段中,您知道在嵌套序列化中如何做到这一点吗。。。。。。因为否则我会得到null或空字段,所以如果我编辑一个字段,它会向我显示一个错误,这些字段不能为空或空。。。。请帮忙。。。。谢谢您正在实例化没有对象或“data”关键字参数的UserSerializer。我相信这是因为用户_数据并不完全适合传递给UserSerializer。但是使用序列化程序仍然是不正确的,不是吗?