user1584120
user1584120

Reputation: 1261

django how to serialize fields into DateTimeRangeField

I'm having a bit of trouble serializing fields into DateTimeRangeField. The request currently has to have the following format:

data = {"time":
         {
           "lower": timeThing,
           "upper": laterTimeThing
         }
       }

What I would like it to look like on the request is this:

data = {
           "start": timeThing,
           "end": laterTimeThing
       }

So I can then serialize start/end into lower/upper. Here is my model:

class Example(models.Model):
    time = DateTimeRangeField()
    user = models.ForeignKey('user.User')

class ExampleAPI(ListCreateAPIView):
    serializer_class = ExampleSerializer
    pagination_class = None
    queryset = Example.objects.all()

    def perform_create(self, serializer):
        serializer.save(user=self.request.user)

class ExampleSerializer(serializers.ModelSerializer):
    time = DateTimeRangeField(write_only=True)
    user = serializers.ReadOnlyField(source='user.id')

    class Meta:
        model = Example
        exclude = ['user']

I've tried creating a custom field but it doesn't seem to go into the overriden to_representation or to_internal_value. The error message I got was {'time': ['This field is required.']}

Upvotes: 3

Views: 1683

Answers (1)

ahprosim
ahprosim

Reputation: 358

You can try DateRangeField from drf-extra-fields:

pip install drf-extra-fields

Then:

import datetime

from rest_framework import serializers
from drf_extra_fields.fields import DateRangeField


class RangeSerializer(serializers.Serializer):
    ranges = DateRangeField()


serializer = RangeSerializer(data={'ranges': {'lower': datetime.date(2015, 1, 1), 'upper': datetime.date(2015, 2, 1)}})

Upvotes: 4

Related Questions