简体   繁体   English

发布到django休息框架

[英]Post to django rest framework

I'd like to post to my Django server using post so I can add a todo item. 我想使用post发布到我的Django服务器,所以我可以添加一个todo Here is the model: 这是模型:

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. 作为Django的新手,我不明白这个错误。 Any ideas? 有任何想法吗?

You need to access request.data instead 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)

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. ModelViewSet类将为您提供视图方法的默认实现,以列出,创建,检索,更新(全部或部分更新)和删除Todo。 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. 这些操作映射到不同url的某些方法,get映射到list和retrieve,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. 在这里,我们明确说明请求方法的映射,以查看我之前提到的操作。

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()

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()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM