2017-07-20 6 views
1

Ich möchte auf meinem Django-Server mit post, so dass ich einen todo Artikel hinzufügen kann. Hier ist das Modell:Beitrag zu Django Rest Framework

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 

Und Serializer:

class TodoSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Todo 
     fields = ("id", 'title','text', 'completed', 'created_at') 

und Aussicht:

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) 

Meine Post-Anforderung ist

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

Und es hat mir gesagt,

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

Als Neuling in Django verstehe ich diesen Fehler nicht. Irgendwelche Ideen?

+0

Anstatt so zu erstellen, können Sie immer Serializer für das gleiche verwenden. –

Antwort

1

Statt wie diese zu erstellen, können Sie immer Serializer verwenden für den gleichen

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

Danke das klappt gut, kannst du mir bitte auch zeigen wie das mit PUT und DELETE funktionieren kann? –

2

Sie benötigen request.data statt request.POST, für den Zugriff auf

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

für Put-Anfrage:

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 

für löschen:

1

Da Sie neben den Post in den Kommentaren auch nach anderen Methoden gefragt haben, zeige ich Ihnen ein Beispiel für ein ModelViewSet, mit dem Sie einen Todo hinzufügen sowie Unterstützung für das Abrufen, Aktualisieren, und lösche deine Todos.

Empfohlene Lektüre:
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 

Die ModelViewSet Klasse werden Sie mit einer Standardimplementierung Ansicht Methoden bieten aufzulisten, erstellen, abzurufen, zu aktualisieren (ganz oder teilweise Aktualisierung), und löschen Sie Aufgaben. Diese Aktionen werden bestimmten Methoden für verschiedene URLs zugeordnet, get wird der Liste zugeordnet und abgerufen, post wird zugeordnet, um zu erstellen, put und patch werden zugeordnet, um update und partial_update zu mappen, und delete wird zugeordnet, um zu zerstören.

Dann in Ihrem urls.py, schließen die TodoViewSet TodoViewSet.as_view(...) mit:

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', 
    ) 
] 

Hier werden wir explizit die Zuordnung von Anforderungsmethoden unter Angabe Aktionen anzuzeigen, die ich bereits erwähnt.

+0

Danke für Ihre Hilfe. Und was ist (? P \ d +) in der URLs.py? –

+0

(? P \ d +) ist ein Regex-Platzhalter, um den Todo-Objekt-Primärschlüssel in der URL zu erfassen und das Objekt zu suchen, das in diesem Fall eine Ganzzahl sein sollte. Sie können anpassen, welches Feld die Ansicht von der URL erwartet und welches Feld in dem Modell sie zum Suchen verwendet. http: //www.django-rest-framework.org/api-guide/generische-views/# genericapiview – ARJMP