发布到django休息框架

Gro*_* Ni 5 python django post django-rest-framework

我想发布到我的Django服务器,post所以我可以添加一个todo项目.这是模型:

class Todo(models.Model):
    title = models.CharField(max_length=200);
    text = models.TextField()
    completed = models.BooleanField(default=False)
    created_at = models.DateTimeField(default=datetime.now, blank = True )
    def __str__(self):
        return self.title
Run Code Online (Sandbox Code Playgroud)

和序列化器:

class TodoSerializer(serializers.ModelSerializer):
    class Meta:
        model = Todo
        fields = ("id", 'title','text', 'completed', 'created_at')
Run Code Online (Sandbox Code Playgroud)

并查看:

class TodoList(APIView):
    def get(self,request):
        todo=Todo.objects.all()
        serializer=TodoSerializer(todo,many=True)
        return Response(serializer.data)
    def post(self,request):
        Todo.objects.create(
            title=request.POST.get('title'),
            text=request.POST.get('text'))
        return HttpResponse(status=201)
Run Code Online (Sandbox Code Playgroud)

我的帖子请求是

{ "title": "new title",
  "text": "a test text"}
Run Code Online (Sandbox Code Playgroud)

它告诉我

IntegrityError at /todos/
(1048, "Column 'title' cannot be null")
Run Code Online (Sandbox Code Playgroud)

作为Django的新手,我不明白这个错误.有任何想法吗?

zai*_*zil 11

您需要访问request.data而不是request.POST,

def post(self,request):
    serializer = TodoSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Run Code Online (Sandbox Code Playgroud)


Ash*_*rma 3

您始终可以使用序列化器来实现相同的目的,而不是像这样创建

data_serializer = TodoSerializer(data=request.data)
if data_Serializer.is_valid():
    data_Serializer.save()
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这效果很好,您能告诉我这如何与 PUT 和 DELETE 请求一起使用吗? (2认同)