[英]Post to django rest framework
我想使用post
发布到我的Django服务器,所以我可以添加一个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
和序列化器:
class TodoSerializer(serializers.ModelSerializer):
class Meta:
model = Todo
fields = ("id", 'title','text', 'completed', 'created_at')
并查看:
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)
我的帖子请求是
{ "title": "new title",
"text": "a test text"}
它告诉我
IntegrityError at /todos/
(1048, "Column 'title' cannot be null")
作为Django的新手,我不明白这个错误。 有任何想法吗?
您需要访问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)
由于您在评论中询问了除post后的其他方法,我将展示一个ModelViewSet的示例,它允许您发布添加Todo,以及提供对检索,更新和删除Todo的支持。
推荐阅读:
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
ModelViewSet类将为您提供视图方法的默认实现,以列出,创建,检索,更新(全部或部分更新)和删除Todo。 这些操作映射到不同url的某些方法,get映射到list和retrieve,post映射到create,put和patch映射到update和partial_update,delete映射到destroy。
然后在你的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',
)
]
在这里,我们明确说明请求方法的映射,以查看我之前提到的操作。
您可以始终使用序列化程序,而不是像这样创建
data_serializer = TodoSerializer(data=request.data)
if data_Serializer.is_valid():
data_Serializer.save()
投标请求:
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
删除:
todo_item = Todo.objects.get(id=id) // Need to get that element
todo_item.delete()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.