сериализатор django rest framework сохраняет значение поля в виде пустых строк, но без ошибок

сериализатор django rest framework сохраняет значение поля в виде пустых строк, но без ошибок

views.py

from django.shortcuts import render
from rest_framework import viewsets

from rest_framework.authentication import TokenAuthentication

from .models import MyTodo
from .serializers import  MyTodoSerializer


class MyTodoView(viewsets.ModelViewSet):

    queryset = MyTodo.objects.all()
    serializer_class = MyTodoSerializer

и моя модель

models.py

from django.db import models

# Create your models here.

class MyTodo(models.Model):
    # Autoincrement id
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=200, blank=True, default='')
    description = models.CharField(max_length=20, blank=True, default='')
    created_on = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

и мой сериализатор

сериализаторы.py

from rest_framework import serializers
from mytodo.models import MyTodo

class MyTodoSerializer( serializers.ModelSerializer ):

    title = serializers.CharField(max_length=200, default='')
    description = serializers.CharField(max_length=200, default='')
    created_on = serializers.DateTimeField(format="%Y-%m-%dT%H:%M:%S", required=False)

    def create(self, validated_data):
        return MyTodo.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.title = validated_data.get('title', instance.title)
        instance.description = validated_data.get('description', instance.description)
        instance.created_on = validated_data.get('created_on', instance.created_on )
        instance.save()
        return instance


    class Meta:
        model = MyTodo
        fields = [ 'id','url','title','description', 'created_on' ]

Выглядит довольно просто, прямолинейно, но вызовы CURL сохраняют пустые поля, но Browsable API View работает очень хорошо. Пожалуйста, скажите мне, что я делаю неправильно.

Вот что я пытаюсь сделать

Курчавый клиент

#!/bin/bash

b64credential=$(echo 'admin:admin' | base64)

access_token=$(curl -d "username=admin&password=admin"  -X POST 'http://localhost:8000/api/token/' \
-H 'Accept:application/json' \
-H "Authorization:Basic  ${b64credential}" | jq --raw-output '.access' )

echo "Access token : $access_token"

# post a todo to  mytodo api

curl -vvv -L -d '{"title": "Awesome things to be done" ,"description": "Really great things stay alert"}' \
     -X POST 'http://localhost:8000/mytodo/' \
     -H 'Accept:application/json' \
     -H "Authorization:Bearer  ${access_token}"

ответ выглядит следующим образом

{"id":23,"url":"http://localhost:8000/mytodo/23/","title":"","description":"","created_on":"2021-05-14T10:02:45"}

Вот еще пара вопросов

  1. Почему я получаю title:, description: ,

  2. в представлении у меня только serializer_class = MyTodoSerializer нет информации о фактической обработке запроса, как Django правильно вызывает правильный метод MyTodoSerializer.create()


person indianwebdevil    schedule 14.05.2021    source источник


Ответы (1)


Вы установили '' в качестве значения по умолчанию, и полезная нагрузка cURL не передается в Django.

Причина в том, что ваш заголовок неверен.

Is

     -H 'Accept:application/json' \

должно быть

     -H "Content-Type: application/json"

Попробуйте это вместо этого.

curl -vvv -L -d '{"title": "Awesome things to be done" ,"description": "Really great things stay alert"}' -X POST 'http://localhost:8000/mytodo/' -H "Content-Type: application/json" -H "Authorization:Bearer  ${access_token}"

Разницу между этими двумя заголовками можно найти здесь.

person Tom Wojcik    schedule 14.05.2021
comment
Фантастические глаза @tomwojcik - person indianwebdevil; 14.05.2021