2017-06-29 124 views
1

我是新来使用Django Rest框架和序列化数据,我试图更新嵌套的序列化程序,但跑到墙上,我环顾四周,但大多数人都有问题在serializers.py一边我甚至不能进入高清更新没有错误,这些都是我的课:Django Rest框架,更新嵌套的序列化数据

Views.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) 

serializers.py

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": "[email protected]", 
      "last_login": "2017-06-29T15:16:11.438818Z", 
      "date_joined": "2017-06-23T16:48:38Z", 
      "is_active": true 
     } 
    } 
] 

我现在的错误: (发表资料:手机= 0000000)

AttributeError at /profile/ 
'QuerySet' object has no attribute '_meta' 

谢谢!

回答

2

您看到此错误是因为您将queryset而不是实例传递给串行器__init__。为了解决错误的改变这一点:

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) 
换句话说,而不是queryset的

,其返回的filter需要通过get返回简介实例。

UPD

更新嵌套的用户尝试这个(没有测试它,让我知道这有什么错误):

def update(self, instance, validated_data): 
    user = validated_data.get('user') 
    instance.user.first_name = user.get('first_name') 
    instance.user.save() 

    print("hey") 
    return instance 
+0

太棒了!这适用于正常更新,我可以更改上层(电话)上的数据,但是您能否帮助我更新嵌套集的数据? (例如更改用户名) 我给它一个尝试发布'user.email = something',但得到以下错误'.update()方法不支持可写嵌套字段默认情况下.'我怎么写我的自定义更新方法做到这一点呢?再次感谢 – Amirgem

+1

@Amirgem检查更新:) – neverwalkaloner

+0

我仍然得到相同的错误,它看起来会工作,但我似乎并没有进入该功能,当我发布数据时,它会尝试默认更新,而不是我的自定义的,我需要在我的视图中使用.update()或什么来指定它? – Amirgem

2

发现自己在类似的情况,我能解决如下。希望它有帮助。

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 
相关问题