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
Post to django rest framework
提问by Grox Ni
I'd like to post to my Django server using post
so I can add a todo
item. 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.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)
回答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()