繁体   English   中英

Django-Rest-Framework'str'对象没有属性'id'

[英]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)但正在更新用户实例?)。

改进

您可以尝试使用代码轻松完成的事情:

  1. 使用ModelSerializer而不是序列化器
  2. 使用ModelViewSet而不是基于函数的视图( 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM