You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
), f"{self.__class__.__name__} should retrieve service context from view."
service=self.context["service"]
assertisinstance(
service, service_class
), f"{self.__class__.__name__} - The service injected from view and the service declared in the decorator are not the same.({service} - {service_class})"
setattr(self, "service", service)
dto=service.dto
ifdto_class:
assertisinstance(
dto, dto_class
), f"{self.__class__.__name__} - The dto injected from view and the dto declared in the decorator are not matched.({service.dto} - {dto})"
setattr(self, "dto", dto)
cls.__init__=__init__
returncls
안녕하세요. 한국어로 이슈 남기는 게 참 익숙하진 않지만 해당 부분에서 drf 부분으로 문제가 있어서 이슈 남깁니다.
어떤 SomeSerializer가 있을때
@service_layer
class SomeSerializer(serializer.ModelSerializer):
가 있고
serializer = SomeSerializer(objs, many=True)라고 했을 때
service_layer에서 setattr(dto~~) 하는 부분이 작동을 하지 않을 거에요
이유는 drf의 BaseSerializer class의 __new__함수를 보면 알 수 있는데,
class BaseSerializer(Field):
---- 생략 ----
def __init__(self, instance=None, data=empty, **kwargs):
----- 생략 ------
def __new__(cls, *args, **kwargs):
# We override this method in order to automatically create
# `ListSerializer` classes instead when `many=True` is set.
if kwargs.pop('many', False):
return cls.many_init(*args, **kwargs)
return super().__new__(cls, *args, **kwargs)
저기처럼 many true일 경우에는 super().new가 실행되지 않고
cls.many_init을 실행하기 때문입니다.
해당 문제 해결하시려면 init 뿐만 아니라, __new__의 return에도 setattr처리해주셔야해요!
drf-service-layer/drf_service_layer/services.py
Lines 13 to 44 in 5bd91d6
안녕하세요. 한국어로 이슈 남기는 게 참 익숙하진 않지만 해당 부분에서 drf 부분으로 문제가 있어서 이슈 남깁니다.
어떤 SomeSerializer가 있을때
저기처럼 many true일 경우에는 super().new가 실행되지 않고
cls.many_init을 실행하기 때문입니다.
해당 문제 해결하시려면 init 뿐만 아니라, __new__의 return에도 setattr처리해주셔야해요!
제가 코드를 잘짜는 사람은 아니지만 아래와 같이 고치시면 좋을 것 같아요.
The text was updated successfully, but these errors were encountered: