2016-10-31 33 views
1

我有以下的JSON GET請求去定義產品配置的服務器空validated_data: {'currency': ['"GBP"'], 'productConfig': ['[{"component":"c6ce9951","finish":"b16561c9"},{"component":"048f8bed","finish":"b4715cda"},{"component":"96801e41","finish":"8f90f764"},{"option":"6a202c62","enabled":false},{"option":"9aa498e0","enabled":true}]']}Django的REST框架 - is_valid()始終傳遞和返回

我試圖通過DRF驗證這一點,我有以下配置:

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) 

正如你可以看到我試圖通過使用在線串行的同一個請求中驗證多個模型。

我的問題 上面的代碼讓一切通過is_valid()(甚至當我做了無效請求,並且,它也返回一個空validated_dataOrderedDict([]))值。

我在做什麼錯?


額外信息

的JS生成GET請求如下: this.pricingRequest = $.get(this.props.pricingEndpoint, { productConfig: JSON.stringify(this.state.productConfig), currency: JSON.stringify(this.state.selectedCurrency) }, function (returnedData, status) { console.log(returnedData);

+0

你的服務器json數據有點奇怪。這不是一個正確的json格式。 1. json字段名必須用''''而不是'''引用2.數組內的對象應該用'{}'引用,'[「GBP」]'不是一個正確的數組,應該是'[{貨幣「:」英鎊「}]'。嘗試修復你的json第一個。 – Enix

回答

0

我目前還沒有一臺計算機通過源挖,但你可能要檢查你的串行的read_only參數。 Afaik只適用於在回覆中顯示數據。

您可以輕鬆地通過使用IPDB(IPython的調試器) 只要把檢查:

import ipdb; ipdb.set_trace() 

某處要開始調試,啓動你的服務器,並啓動請求。

+0

感謝您的回覆 - 這是一個GET請求(因爲它不會改變後端的狀態)我會更新我的答案與jQuery代碼生成請求 – AndrewO

+0

Sry改變了我的答案,目前手機上有點慢...... –

+0

就像@JohannesReichard說的,問題在read_only標誌中。 如果一個字段是read_only,這意味着你不能修改它,所以無論如何您爲此字段提供的有效或無效值將被丟棄。 – Ramast