Deserialization using djangorestframework-jsonapi

23 views Asked by At

I am trying to use djangorestframework-jsonapi to deserialize JSON:API payload.

Payload :

{
  "data": {
    "id": "1234",
    "type": "parking",
    "attributes": {
      "start": "2024-01-18",
      "end": "2024-01-20"
    }
  }
}

(De)serializer :

from rest_framework_json_api import serializers


class ParkingDeserializer(serializers.Serializer):
    id = serializers.CharField()
    start = serializers.DateField()
    end = serializers.DateField()

When deserialized, following errors appears :

>>> from parking import ParkingDeserializer
>>> dsrz = ParkingDeserializer(data=payload['data'])
>>> dsrz.is_valid()
False
>>> dsrz.errors
{'start': [ErrorDetail(string='This field is required.', code='required')], 'end': [ErrorDetail(string='This field is required.', code='required')]}

I thought JSON:API standard and the use of djangorestframework-jsonapi was self sufficient to know what to do. What i mean is a correct mapping as attributes start and end are attributes of parking type.

What am i missing ?

2

There are 2 answers

0
Tanveer On
{
   "id": "1234",
   "start": "2024-01-18",
   "end": "2024-01-20"
}

it should be like this according to your serializer.

0
Emile On

Actually what I missed is the parsing step. Indeed DRF JSON:API library has its own parser to correctly map a JSON:API payload with fields required in the serializer.

>>> from rest_framework_json_api.parsers import JSONParser
>>> parsed_data = JSONParser().parse_data(payload, None)
{
    "id": "1234",
    "type": "parking",
     "start": "2024-01-18",
     "end": "2024-01-20"
}
>>> ParkingDeserializer(data=parsed_data).is_valid()
True