post
アイテムを追加できるように、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)
私の投稿リクエストは
{ "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)
コメントに投稿する以外の方法についても尋ねたので、投稿してTodoを追加したり、Todoの取得、更新、削除をサポートしたりできる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
_
ModelViewSetクラスは、Todoを一覧表示、作成、取得、更新(全体または部分的な更新)、および削除するためのビューメソッドのデフォルト実装を提供します。これらのアクションはさまざまな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',
)
]
_
ここで、前に述べたアクションを表示するためのリクエストメソッドのマッピングを明示的に述べています。
このように作成する代わりに、同じために常にシリアライザーを使用できます
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()