尝试向API发送POST请求时出现属性错误-Django

时间:2020-07-30 11:26:15

标签: python json django

我使用Django和DRF创建了一个非常基本的API,但是当我使用POST请求时,出现一个错误,我现在无法解决一段时间。 这是Views.py

def user_list(request):
"""
List all code users, or create a new user.
"""
if request.method == 'GET':
    users = Users.users.all()
    serializer = UserSerializer(users, many=True)
    return JsonResponse(serializer.data, safe=False)

elif request.method == 'POST':
    data = JSONParser().parse(request.body)
    serializer = UserSerializer(data=data)
    if serializer.is_valid():
        serializer.save()
        return JsonResponse(serializer.data, status=201)
    return JsonResponse(serializer.errors, status=400)

这是回溯

 Internal Server Error: /users/
 Traceback (most recent call last):
 File "C:\Users\35988\anaconda3\lib\site-packages\django\core\handlers\exception.py", line 34, in 
 inner
 response = get_response(request)
 File "C:\Users\35988\anaconda3\lib\site-packages\django\core\handlers\base.py", line 115, in 
 _get_response
 response = self.process_exception_by_middleware(e, request)
 File "C:\Users\35988\anaconda3\lib\site-packages\django\core\handlers\base.py", line 113, in 
 _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
 File "C:\Users\35988\Desktop\GitHubRepos\DjangoSalesPlatform\SalesPlatform\Sales\views.py", line 36, 
in user_list data = JSONParser().parse(request.body)
File "C:\Users\35988\anaconda3\lib\site-packages\rest_framework\parsers.py", line 65, in parse
  return json.load(decoded_stream, parse_constant=parse_constant)
File "C:\Users\35988\anaconda3\lib\site-packages\rest_framework\utils\json.py", line 31, in load
 return json.load(*args, **kwargs)
 File "C:\Users\35988\anaconda3\lib\json\__init__.py", line 293, in load
return loads(fp.read(),
 File "C:\Users\35988\anaconda3\lib\codecs.py", line 496, in read
newdata = self.stream.read()
AttributeError: 'bytes' object has no attribute 'read'
[30/Jul/2020 14:16:43] "POST /users/ HTTP/1.1" 500 87662

模型

class Users(models.Model):
id=models.AutoField(primary_key=True)
name = models.CharField(max_length=200)
email = models.CharField(max_length=200)
position = models.CharField(max_length=15)
users = models.Manager()

serializers.py

class UserSerializer(serializers.Serializer):
id=serializers.IntegerField()
name = serializers.CharField(max_length=None)
email = serializers.CharField(max_length=None)
position = serializers.CharField(max_length=None)
def create(self, validated_data):
    return Users.users.create(**validated_data)
def update(self,instance,validated_data):
    instance.id=validated_data.get('id',instance.id)
    instance.name=validated_data.get('name',instance.name)
    instance.email=validated_data.get('email',instance.email)
    instance.position=validated_data.get('position',instance.position)
    instance.save()
    return instance

我使用模型和序列化器进行修改,我想问题的原因可能来自这两个文件,但我仍在搜索

2 个答案:

答案 0 :(得分:0)

您不需要从外部解析JSON主体,Django会直接为您解析。 更改以下行:

data = JSONParser().parse(request.body)

data = request.data or dict() # Incase request.data is None

将给出您要查找的字典。

另外,使用DRF功能而不是返回JsonResponse来考虑使用Response模块中的rest_framework.response是一个好习惯。

答案 1 :(得分:0)

class AddCart(APIView):
  def post(self, request):
    serializer = CartItemSerializer(data=request.data.get('cartitem'))
    if serializer.is_valid(raise_exception=True):
        cartitem_saved = serializer.save()
    return Response({"success": "Cart '{}' added successfully".format(cartitem_saved.item)})

尝试这样