[英]Django 'str' object has no attribute 'values' in rest_framework
[英]Django-Rest-Framework 'str' object has no attribute 'id'
我正在DRF中创建一个呼叫以发布到该站点。 我有点困惑为什么会收到此错误。 我不明白为什么这期望它是str。 我知道有类似的职位,但他们仍然无法解决问题。
错误
AttributeError: 'str' object has no attribute 'id'
[03/Apr/2018 10:55:12] "POST /api/user/UserProfile/1/ HTTP/1.1" 500 83982
serializer.py看起来像,如果我删除instance.id,我将得到相同的错误,但仅适用于下一行。
from rest_framework import serializers
from api.models import UserProfile
from django.contrib.auth.models import User
class UserProfileSerializer(serializers.Serializer):
# id = serializers.UUIDField()
class Meta:
model = UserProfile
def create(self, validated_data):
return UserProfile.objects.create(**validated_data)
def update(self, instance, validated_data):
instance.id = validated_data.get('profile_id', str(instance.id))
instance.user_id = validated_data.get('user_id', instance.user_id)
instance.save()
return instance
视图
@csrf_exempt
def user_profile_list(request, user_id):
try:
userid = user_id
except userid.DoesNotExist:
return HttpResponse(status=404)
if request.method == 'GET':
uprofile = UserProfile.objects.all().values()
list2 = list(uprofile)
return JsonResponse(list2, safe=False)
elif request.method == 'POST':
data = JSONParser().parse(request)
serializer = UserProfileSerializer(userid, data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, status=201)
return JsonResponse(serializer.errors, status=400)
urls.py
url(r'^api/user/UserProfile/(?P<user_id>[0-9]+)/$', userprofile.user_profile_list),
您传递给序列化程序userid
而不是用户对象。 要使用序列化程序更新对象,应将实例作为第一个参数传递。 将视图更改为此:
elif request.method == 'POST':
data = JSONParser().parse(request)
user = User.objects.get(id=userid)
serializer = UserProfileSerializer(user, data=data)
...
AttributeError的
问题在于serializer = UserProfileSerializer(userid, data=data)
,您正在将userid
传递给序列化器而不是用户或用户配置文件实例,我说这是因为或我对逻辑不太清楚(使用UserProfileSerializer)但正在更新用户实例?)。
改进
您可以尝试使用代码轻松完成的事情:
user_profile_list
) 使用ModelSerializer和ModelViewSet的通用版本如下所示:
serializers.py
from rest_framework import serializers
from api.models import UserProfile
class UserProfileSerializer(serializers.ModelSerializer):
class Meta:
model = UserProfile
# preferably listing the fields to avoid any code breaking
# if you add fields to the model later on
fields = '__all__'
views.py
from rest_framework import viewsets
from api.serializers import UserProfileSerializer
from api.models import UserProfile
class UserProfileViewSet(viewsets.ModelViewSet):
queryset = UserProfile.objects.all()
serializer_class = UserProfileSerializer
我强烈建议您阅读DRF的官方教程 ,如果您了解应用程序的哪些部分已经在DRF中实现并且可以用很少的代码直接使用,它将为您节省大量的开发时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.