AndrewO
AndrewO

Reputation: 1125

Django REST Framework - is_valid() always passing and empty validated_data being returned

I have the following JSON GET request going to the server that defines a product configuration: {'currency': ['"GBP"'], 'productConfig': ['[{"component":"c6ce9951","finish":"b16561c9"},{"component":"048f8bed","finish":"b4715cda"},{"component":"96801e41","finish":"8f90f764"},{"option":"6a202c62","enabled":false},{"option":"9aa498e0","enabled":true}]']}

I'm trying to validate this through DRF, and I have the following configuration:

views.py

class pricingDetail(generics.ListAPIView):
    authentication_classes = (SessionAuthentication,)
    permission_classes = (IsAuthenticated,)
    parser_classes = (JSONParser,)
    def get(self, request, *args, **kwargs):
            pricingRequest = pricingRequestSerializer(data=request.query_params)
            if pricingRequest.is_valid():
                return Response('ok')

serializers.py

class pricingComponentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Component
        fields = ('sku',)

class pricingFinishSerializer(serializers.ModelSerializer):
    class Meta:
        model = Finish
        fields = ('sku',)

class pricingOptionSerializer(serializers.ModelSerializer):
    class Meta:
        model = ProductOption
        fields = ('sku',)

class pricingConfigSerializer(serializers.ModelSerializer):
    finish = pricingFinishSerializer(read_only=True, many=True)
    component = pricingComponentSerializer(read_only=True, many=True)
    option = pricingOptionSerializer(read_only=True, many=True)
    enabled = serializers.BooleanField(read_only=True)


class pricingCurrencySerializer(serializers.ModelSerializer):
    class Meta:
        model = Currency
        fields = ('currencyCode',)

class pricingRequestSerializer(serializers.Serializer):
    config = pricingConfigSerializer(read_only=True)
    currency = pricingCurrencySerializer(read_only=True)

As you can see I'm trying to validate multiple models within the same request through the use of inline serializers.

My problem The code above allow everything to pass through is_valid() (even when I make an invalid request, and, it also returns an empty validated_data (OrderedDict([])) value.

What am I doing wrong?


extra information

the JS generating the GET request is as follows: this.pricingRequest = $.get(this.props.pricingEndpoint, { productConfig: JSON.stringify(this.state.productConfig), currency: JSON.stringify(this.state.selectedCurrency) }, function (returnedData, status) { console.log(returnedData);

Upvotes: 2

Views: 1503

Answers (1)

Johannes Reichard
Johannes Reichard

Reputation: 947

I currently don't have a computer to dig through the source but you might want to check the read_only parameters on your serializer. Afaik this only works for showing data in responses.

You can easily check by using ipdb (ipython debugger) Just put:

import ipdb; ipdb.set_trace()

Somewhere you want to start debugging, start you server and start the request.

Upvotes: 1

Related Questions