【问题标题】:REST API, JSONDecodeError("Expecting value", s, err.value) from None json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)REST API, JSONDecodeError("Expecting value", s, err.value) from None json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
【发布时间】:2020-09-05 00:06:38
【问题描述】:

我有一个基于 django 的网站,其中包含用户配置文件系统,用户可以在其中添加注释。我正在尝试通过 REST 框架实现 CRUD。我按照本教程进行操作:

https://dev.to/nobleobioma/build-a-crud-django-rest-api-46kc

我已经修改了代码。我有一个名为 Note 的模型,这是模型的代码:

class Note(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name="notes")
type = models.IntegerField(choices=NOTE_TYPE, default=0)
updated_on = models.DateTimeField(auto_now=True)
content = models.TextField()
created_on = models.DateTimeField(auto_now_add=True)

class Meta:
    ordering = ["-created_on"]

视图类如下:

@api_view(["POST"])
@permission_classes([IsAuthenticated])
@csrf_exempt
def add_note(request):
    payload = json.loads(request.body)
    user = request.user.id
    note = Note.objects.create(
        type=payload["type"],
        content=payload["content"],
        author=user,
)
serializer = NoteSerializer(note)
return JsonResponse({'notes': serializer.data}, safe=False, status=status.HTTP_201_CREATED)

当我运行服务器时,所有其他 URL 都可以工作,但链接到此类的 URL 给了我以下错误:

从 None 提高 JSONDecodeError("Expecting value", s, err.value) json.decoder.JSONDecodeError:预期值:第 1 行第 1 列(字符 0)

似乎错误是由该行引起的:

payload = json.loads(request.body)

我已经尝试了许多类似错误的解决方案,但似乎没有任何帮助。

这是序列化程序:

class NoteSerializer(serializers.ModelSerializer):
class Meta:
    model = Note
    fields = ['type', 'content']

【问题讨论】:

  • 你能分享serializers.py文件吗?还有可以分享serializer.data的内容吗?
  • 感谢您指出这一点,我已经编辑了帖子。

标签: python django rest


【解决方案1】:

更新您的视图(当您使用基于函数的视图时),让 django rest 框架来处理您的数据的序列化和反序列化。

@api_view(["POST"])
@permission_classes([IsAuthenticated])
@csrf_exempt
def add_note(request):
    data = request.data
    user_id = request.user.id
    user = User.objects.get(id=user_id)
    serializer = NoteSerializer(data=data)
    if serializer.is_valid():
       serializer.save(author=user)
       return Response(serializer.data, status=status.HTTP_201_CREATED)
   return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

现在试试,你会得到你想要的输出。

【讨论】:

  • 谢谢!如果我想动态保存一些字段而不是通过 API,我该怎么做?例如作者,作为作者外键到用户表,它应该是登录用户。
  • 看到我已经更新了我的答案,现在您可以使用登录用户创建Note
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
  • 2018-11-12
  • 2020-04-19
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
相关资源
最近更新 更多