Search code examples
djangodjango-rest-frameworknesteddjango-serializer

Nested Serializers - how to access attrs from serializer's field during validate


I created nested serializers and during validate method in parent serializer I don't have any data from child serializer. When i raise error with 'attrs' as message then i get only data from 'pk' and 'name' fields. How can i get data from OpenningTimeSerializer in WarehouseSerializer??

serializers.py

class OpenningTimeSerializer(serializers.ModelSerializer):

    class Meta:
        model = OpenningTime
        fields = ['weekday', 'from_hour', 'to_hour']

class WarehouseSerializer(serializers.ModelSerializer):
    openning_time = OpenningTimeSerializer(many=True)

    class Meta:
        model = Warehouse
        fields = ['pk', 'name', 'openning_time']

    def validate(self, attrs):
        raise serializers.ValidationError(attrs)

models.py

class Time(models.Model):

    from_hour = models.TimeField()
    to_hour = models.TimeField()

    class Meta:
        abstract = True
        constraints = [
            models.CheckConstraint(
                check=Q(from_hour__lt=F('to_hour')),
                name='%(class)s_check_hours'
            )
        ]


class OpenningTime(Time):

    weekday = models.IntegerField(
        choices=WEEKDAYS)

    def __str__(self):
        return f"{self.get_weekday_display()} {self.from_hour.strftime('%H:%M')}-{self.to_hour.strftime('%H:%M')}"


class Warehouse(models.Model):

    name = models.CharField(max_length=255, unique=True)
    openning_time = models.ManyToManyField(OpenningTime)

    def __str__(self):
        return self.name

Solution

  • Okey, I figured this out. I can have access to data from child serializers by self.initial_data, additionally need to convert string data and pass to serializer.

    def validate(self, attrs):
        openning_data = json.loads(self.initial_data['openning_time'])
        serializer = OpenningTimeSerializer(data=openning_data)
        if not serializer.is_valid():
            raise serializers.ValidationError(serializer.errors)
        serializer.data