我使用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
我使用模型和序列化器进行修改,我想问题的原因可能来自这两个文件,但我仍在搜索
答案 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)})
尝试这样