Python 发布到 django rest 框架

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/45205039/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-19 16:49:16  来源:igfitidea点击:

Post to django rest framework

pythondjangopostdjango-rest-framework

提问by Grox Ni

I'd like to post to my Django server using postso I can add a todoitem. Here is the model:

我想发布到我的 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

And serializers:

和序列化器:

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

And view:

并查看:

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)

My post request is

我的帖子请求是

{ "title": "new title",
  "text": "a test text"}

And it told me

它告诉我

IntegrityError at /todos/
(1048, "Column 'title' cannot be null")

As a newbie at Django, I don't understand this error. Any ideas?

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

回答by zaidfazil

You need to access request.datainstead of request.POST,

您需要访问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)

回答by A. J. Parr

Since you've asked about other methods besides post in the comments, I'll show an example of a ModelViewSet that will allow you to post to add a Todo, as well as provide support for retrieving, updating, and deleting your Todo's.

由于您在评论中询问了除了 post 之外的其他方法,我将展示一个 ModelViewSet 的示例,它允许您发布以添加 Todo,并提供对检索、更新和删除 Todo 的支持。

Recommended reading:
http://www.django-rest-framework.org/api-guide/viewsets/#modelviewset

推荐阅读:http:
//www.django-rest-framework.org/api-guide/viewsets/#modelviewset

from rest_framework.viewsets import ModelViewSet
from todo.models import Todo
from todo.serializers import TodoSerializer

class TodoViewSet(ModelViewSet):
    queryset = Todo.objects.all()
    serializer_class = TodoSerializer

The ModelViewSet class will provide you with a default implementation of view methods to list, create, retrieve, update (whole or partial update), and delete Todo's. These actions are mapped to certain methods for different urls, get is mapped to list and retrieve, post is mapped to create, put and patch are mapped to update and partial_update, and delete is mapped to destroy.

ModelViewSet 类将为您提供视图方法的默认实现,以列出、创建、检索、更新(整体或部分更新)和删除 Todo。这些动作被映射到不同url的特定方法,get被映射到列表和检索,post被映射到create,put和patch被映射到update和partial_update,delete被映射到destroy。

Then in your urls.py, include the TodoViewSet using TodoViewSet.as_view(...):

然后在您的 urls.py 中,使用TodoViewSet.as_view(...)以下方法包含 TodoViewSet :

from django.conf.urls import url
from todo.views import TodoViewSet

urlpatterns = [
    url(
        r'^todos/$',
        TodoViewSet.as_view({'get': 'list', 'post': 'create'}),
        name='todo-list',
    ),
    url(
        r'^todos/(?P<pk>\d+)/$',
        TodoViewSet.as_view({'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy'}),
        name='todo-detail',
    )
]

Here we are explicitly stating the mapping of request methods to view actions that I mentioned before.

在这里,我们明确说明了我之前提到的请求方法到查看操作的映射。

回答by Ashish Kumar Verma

Instead of creating like this, You can always use serializers for the same

而不是像这样创建,你总是可以使用序列化程序来做同样的事情

data_serializer = TodoSerializer(data=request.data)
if data_Serializer.is_valid():
    data_Serializer.save()

回答by Ashish Kumar Verma

for put request :

对于放置请求:

todo_item = Todo.objects.get(id=id) // Need to get that element
data_serializer = TodoSerializer(instance=todo_item,data=request.data, partial=True)
if data_Serializer.is_valid():
   data_Serializer.save()
else:
   print  data_Serializer.errors

for delete:

删除:

todo_item = Todo.objects.get(id=id) // Need to get that element
todo_item.delete()