web-dev-qa-db-ja.com

Django= restフレームワークに投稿

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の初心者として、私はこのエラーを理解していません。何か案は?

5
Grox Ni

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)
11
zaidfazil

コメントに投稿する以外の方法についても尋ねたので、投稿して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',
    )
]
_

ここで、前に述べたアクションを表示するためのリクエストメソッドのマッピングを明示的に述べています。

3
A. J. Parr

このように作成する代わりに、同じために常にシリアライザーを使用できます

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

プットリクエストの場合:

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