2017-07-20 88 views
1

我想使用post發佈到我的Django服務器,所以我可以添加todo項目。這裏是模型:發佈到Django休息框架

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) 

我POST請求

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

它告訴我

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

作爲Django的新手,我不明白這個錯誤。有任何想法嗎?

+0

而不是像這樣創建,你可以總是使用序列化程序的相同。 –

回答

1

而不是創造這樣的,您可以隨時使用串行對同一

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

感謝這工作得很好,你可以請告訴我這可以與PUT和DELETE請求一起工作嗎? –

2

您需要訪問的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) 
1

的PUT請求:

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

由於您在評論中詢問了除發佈之外的其他方法,我將展示一個ModelViewSet的示例,該示例將允許您發佈以添加待辦事項,以及爲檢索,更新,並刪除您的Todo's。

推薦閱讀:
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類將爲您提供一個默認的實現的視圖方式列出,創建,檢索,更新(全部或部分更新),並刪除待辦事項的。這些動作被映射到不同url的某些方法,get被映射到列表和檢索,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', 
    ) 
] 

在這裏,我們明確聲明的請求方法映射來查看我之前提到的行動。

+0

感謝您的幫助。什麼是(?p \ d +)在urls.py中匹配? –

+0

(?P \ d +)是一個正則表達式佔位符,用於捕獲URL中的待辦事項對象主鍵並查找對象,在本例中應該是一個整數。您可以自定義視圖期望來自url的字段以及用於查找的模型上的哪個字段。 HTTP://www.django-rest-framework。組織/ API引導/仿製的意見/#genericapiview – ARJMP