반응형
Django Rest Framework의 Serializer 클래스에 추가 인수 전달
Viewset에서 DRF Serializer 클래스에 몇 가지 인수를 전달하고 싶습니다.
class OneZeroSerializer(rest_serializer.ModelSerializer):
def __init__(self, *args, **kwargs):
print args # show values that passed
location = rest_serializer.SerializerMethodField('get_alternate_name')
def get_alternate_name(self, obj):
return ''
class Meta:
model = OneZero
fields = ('id', 'location')
견해
class OneZeroViewSet(viewsets.ModelViewSet):
serializer_class = OneZeroSerializer(realpart=1)
#serializer_class = OneZeroSerializer
queryset = OneZero.objects.all()
기본적으로 뷰에서 Serializer 클래스로 쿼리를 기반으로 일부 값을 전달하면 필드에 할당됩니다.
필드는 실제로 동적으로 생성 된 필드에 포함되지 않습니다.
이 질문에서 같은 경우 stackoverflow 하지만 대답 할 수 없습니다.
누구 든지이 경우 나를 도와 주거나 더 나은 옵션을 제안 할 수 있습니까?
"ModelSerializer"생성자에 대한 "context"인수를 사용하는 것은 상당히 신뢰할 수 있습니다.
예를 들면 :
보기 :
my_objects = MyModelSerializer(
input_collection,
many=True,
context={'user_id': request.user.id}
).data
변환기에서 :
class MyModelSerializer(serializers.ModelSerializer):
...
is_my_object = serializers.SerializerMethodField('_is_my_find')
...
def _is_my_find(self, obj):
user_id = self.context.get("user_id")
if user_id:
return user_id in obj.my_objects.values_list("user_id", flat=True)
return False
...
추가 매개 변수를 사용할 수 있습니다. "self.context"를 사용할 수 있습니다.
redcyb 대답을 수행의하려면 다음과 같이 에서 get_serializer_context
메서드를 사용하는 것이 좋습니다 GenericAPIView
.
def get_serializer_context(self):
return {'user': self.request.user.email}
다음 과 같은 보기 재정의 get_serializer_context
메서드 가 필요 합니다.
def get_serializer_context(self):
return {"customer_id": self.kwargs['customer_id']}
어디서나 serializer
얻을 수 있습니다.
customer_id = self.context["customer_id"]
내가 보관 오래된 코드는 중첩 된 중첩 된 중첩을 필터링하는 데 도움이 될 수 있습니다.
class MySerializer(serializers.ModelSerializer):
field3 = serializers.SerializerMethodField('get_filtered_data')
def get_filtered_data(self, obj):
param_value = self.context['request'].QUERY_PARAMS.get('Param_name', None)
if param_value is not None:
try:
data = Other_model.objects.get(pk_field=obj, filter_field=param_value)
except:
return None
serializer = OtherSerializer(data)
return serializer.data
else:
print "Error stuff"
class Meta:
model = Model_name
fields = ('filed1', 'field2', 'field3')
get_serializer_class를 재정의하는 방법 :
class ViewName(generics.ListAPIView):
def get_serializer_class(self):
param_value = self.context['request'].QUERY_PARAMS.get('Param_name', None)
if param_value is not None:
return Serializer1
else:
return Serializer2
def get_queryset(self):
.....
이것이 도움이되는 사람들에게 도움이되기를 바랍니다.
반응형
'ProgramingTip' 카테고리의 다른 글
쉼표와 세미콜론을 사용하고 있습니까? (0) | 2020.12.29 |
---|---|
람다 함수의 조건문? (0) | 2020.12.29 |
Rust의 기본 함수 인수 (0) | 2020.12.29 |
++ x % = 10은 C ++에서 잘 정의되어 있습니까? (0) | 2020.12.29 |
유창한 인터페이스가 데메테르의 법칙을 경유하고 있습니까? (0) | 2020.12.29 |