【问题标题】:Django REST Framework - is_valid() always passing and empty validated_data being returnedDjango REST Framework - is_valid() 总是通过并返回空的验证数据
【发布时间】:2016-10-31 22:18:43
【问题描述】:

我有以下 JSON GET 请求发送到定义产品配置的服务器: {'currency': ['"GBP"'], 'productConfig': ['[{"component":"c6ce9951","finish":"b16561c9"},{"component":"048f8bed","finish":"b4715cda"},{"component":"96801e41","finish":"8f90f764"},{"option":"6a202c62","enabled":false},{"option":"9aa498e0","enabled":true}]']}

我正在尝试通过 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_data (OrderedDict([])) 值。

我做错了什么?


额外信息

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

【问题讨论】:

  • 您的服务器 json 数据有点奇怪。它不是正确的 json 格式。 1. json 字段名必须引用" 而不是'。 2. 数组里面的对象应该用{}引用,["GBP"]不是一个正确的数组。应该是[{"currency": "GBP"}]。尝试先修复你的 json。

标签: django django-rest-framework


【解决方案1】:

我目前没有计算机可以挖掘源代码,但您可能需要检查序列化程序上的 read_only 参数。 Afaik 这仅适用于在响应中显示数据。

您可以使用 ipdb(ipython 调试器)轻松检查 简单地说:

import ipdb; ipdb.set_trace()

在您想开始调试的地方,启动服务器并启动请求。

【讨论】:

  • 感谢您的回复 - 这是一个 GET 请求(因为它不会更改后端的状态)。我将使用生成请求的 jquery 代码更新我的答案
  • 就像@JohannesReichard 所说的那样,read_only 标志中的问题。如果一个字段是只读的,这意味着您不能修改它,因此您为该字段提供的任何值是否有效都会被丢弃。
猜你喜欢
  • 1970-01-01
  • 2021-04-01
  • 2019-01-05
  • 2021-07-18
  • 2019-08-19
  • 2015-09-28
  • 1970-01-01
  • 2015-05-12
  • 1970-01-01
相关资源
最近更新 更多