在drf中使用请求方法时收到typerror

时间:2019-03-11 21:06:05

标签: python django django-rest-framework request

在一些帮助下,我解决了此issue

我的api正常工作,但是今天我尝试访问'/ api / v1 / docs'时发现了此错误

ngram_range=(2, 2)

我知道错误在这里:

AttributeError at /api/v1/docs/

'NoneType' object has no attribute 'method'

当我删除 def get_fields(self): fields = super().get_fields() if self.context['request'].method in ['POST', 'PATCH', 'PUT']: fields['products'] = serializers.ListField( write_only=True, child=serializers.IntegerField() ) return fields 时,对.method的访问有效,但是我的将某些产品发布到bundleproducts中的解决方案却不起作用。

我的代码:

view.py

/api/v1/docs/

1 个答案:

答案 0 :(得分:0)

这可能是由于此序列化程序在另一个序列化程序中用作嵌套序列化程序引起的。因此,可以说问题序列化器的定义是:

class MySerializer(serializers.Serializer):
    ...

您还有另一个这样的序列化器:

class OtherSerializer(serializers.Serializer):
    my_field = MySerializer()

在这种情况下,实例化 OtherSerializer 的实例时,其上下文不会自动传递给 MySerializer ,因此在上下文中不会有请求> MySerializer 。您可以手动将上下文添加到嵌套序列化程序中,也可以在 get_fields 方法中,检查请求是否存在于 self.context 中,并相应地进行处理。

此外,我不确定您要完成什么,但是如果您为字段提供

write_only=True

在序列化程序类定义中,在读取序列化程序时,即在一般情况下用于获取请求,该字段将不存在,这似乎是您在此处尝试执行的操作。因此,将产品字段添加为只写会产生相同的效果,因此您无需覆盖 get_fields 方法