Ami*_*gem 4 python django serialization django-rest-framework
我是使用 Django Rest Framework 和序列化数据的新手,我正在尝试更新嵌套的序列化程序,但遇到了墙,我环顾四周,但大多数人在 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)
Run Code Online (Sandbox Code Playgroud)
序列化器.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
Run Code Online (Sandbox Code Playgroud)
样本结构
[
{
"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
}
}
]
Run Code Online (Sandbox Code Playgroud)
我当前的错误:( 发布数据:电话 = 0000000)
AttributeError at /profile/
'QuerySet' object has no attribute '_meta'
Run Code Online (Sandbox Code Playgroud)
谢谢!
发现自己处于类似情况,我能够解决如下问题。希望它有所帮助。
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
Run Code Online (Sandbox Code Playgroud)
您看到此错误是因为您将 queryset 而不是 instance 传递给 serializer __init__。要解决错误更改此:
def post(self, request, *args, **kwargs):
profile = Profile.objects.filter(user_id=request.user.id)
Run Code Online (Sandbox Code Playgroud)
对此:
def post(self, request, *args, **kwargs):
profile = Profile.objects.get(user_id=request.user.id)
Run Code Online (Sandbox Code Playgroud)
换句话说,而不是由filter您返回的查询集,您需要返回的 Profile 实例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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7146 次 |
| 最近记录: |