簡體   English   中英

發布到django休息框架

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM