IT/Django

BrowsableAPI AttributeError 해결방법.

bepuri 2021. 3. 13. 17:08
728x90
 
 
 
 
During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\Administrator\project\djangovenv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\Administrator\project\djangovenv\lib\site-packages\django\core\handlers\base.py", line 204, in _get_response
    response = response.render()
  File "C:\Users\Administrator\project\djangovenv\lib\site-packages\django\template\response.py", line 105, in render
    self.content = self.rendered_content
  File "C:\Users\Administrator\project\djangovenv\lib\site-packages\rest_framework\response.py", line 70, in rendered_content
    ret = renderer.render(self.data, accepted_media_type, context)
  File "C:\Users\Administrator\project\djangovenv\lib\site-packages\rest_framework\renderers.py", line 724, in render
    context = self.get_context(data, accepted_media_type, renderer_context)
  File "C:\Users\Administrator\project\djangovenv\lib\site-packages\rest_framework\renderers.py", line 656, in get_context
    raw_data_put_form = self.get_raw_data_form(data, view, 'PUT', request)
  File "C:\Users\Administrator\project\djangovenv\lib\site-packages\rest_framework\renderers.py", line 563, in get_raw_data_form
    data = serializer.data.copy()
  File "C:\Users\Administrator\project\djangovenv\lib\site-packages\rest_framework\serializers.py", line 548, in data
    ret = super().data
  File "C:\Users\Administrator\project\djangovenv\lib\site-packages\rest_framework\serializers.py", line 246, in data
    self._data = self.to_representation(self.instance)
  File "C:\Users\Administrator\project\djangovenv\lib\site-packages\rest_framework\serializers.py", line 515, in to_representation
    ret[field.field_name] = field.to_representation(attribute)
  File "C:\Users\Administrator\project\djangovenv\lib\site-packages\rest_framework\serializers.py", line 515, in to_representation
    ret[field.field_name] = field.to_representation(attribute)
  File "C:\Users\Administrator\project\djangovenv\lib\site-packages\rest_framework\serializers.py", line 502, in to_representation
    attribute = field.get_attribute(instance)
  File "C:\Users\Administrator\project\djangovenv\lib\site-packages\rest_framework\fields.py", line 490, in get_attribute
    raise type(exc)(msg)
AttributeError: Got AttributeError when attempting to get a value for field `image` on serializer `InsuranceSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `RelatedManager` instance.
Original exception text was: 'RelatedManager' object has no attribute 'image'.

Got AttributeError when attempting to get a value for field `image` on serializer `InsuranceSerializer`

frontend쪽에서 api 호출 시에는 정상적으로 응답이 오는데 BrowsableAPI에서만 에러가 뜬다면..

그리고 에러가 위의 내용과 비슷하면 이유는 간단하다.

ModelSerializer에서 만들어지는 데이터를 기반해서 BrowsableAPI에서 form field들을 자동으로 생성한다.

하지만 간혹 FK로 연결된 필드를 어떠한 이유로든 many=True가 아닌 하나의 오브젝트로만 return 해야하는 상황이 있을 수도 있다.

 

그 경우 serializer는 singleobject 기준으로 데이터를 만들어내고 있는데, 실제 폼필드에서는 ModelSerializer에서 FK이기 때문에 자기자신 관점에서 many 관계라고 생각하기 때문이다.

 

그래서 해결방법은 form_field 자체를 없애주면된다.

그럼 데이터 반환은 정상적으로 되고, 폼필드에서 FK를 기준으로 데이터를 생성할 필요가 없으니 정상적으로 Browsable API도 사용가능하게된다.

 

bradmontgomery.net/blog/disabling-forms-django-rest-frameworks-browsable-api/

 

😸 Disabling the Forms in Django Rest Framework's Browsable API

Disabling the Forms in Django Rest Framework's Browsable API Published on Sept. 3, 2015, 8:12 p.m.

bradmontgomery.net

 

방법은 위의 링크를 참고해라~

BrowsableAPI를 오버라이딩하는 적절한 코드이다.

728x90