Сериализатор условных полей Django
У меня есть такой вид:
class UserDetail(generics.RetrieveDestroyAPIView):
permission_classes = [IsAuthenticatedOrReadOnly]
queryset = User.object.all()
serializer_class = UserSerializer
def get_object(self, queryset=None, **kwargs):
item = self.kwargs.get('pk')
return generics.get_object_or_404(User, id=item)
сериализатор следующим образом:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['id', 'first_name', 'last_name', 'city']
и такие урлы, как этот:
path('<uuid:pk>', UserDetail.as_view(), name='user_detail')
Могу ли я с помощью одного представления и одного сериализатора получить в одном случае все данные (id, fist_name, last_name и город), а в другом случае только город в формате json? Или я должен создать для этого специально новое представление и сериализатор, например, так:
class UserCity(generics.RetrieveDestroyAPIView):
permission_classes = [IsAuthenticatedOrReadOnly]
queryset = User.object.all()
serializer_class = UserJustCitySerializer
def get_object(self, queryset=None, **kwargs):
item = self.kwargs.get('pk')
return generics.get_object_or_404(User, id=item)
и
class UserJustCitySerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['city']
Вы можете попробовать SerializerMethodField. Который вернет поле, если условие истинно внутри вашего метода get_your_conditional_field.
class YourSerializer(serializers.ModelSerializer):
your_conditional_field_name = serializers.SerializerMethodField()
class Meta:
model = model_name
def get_your_conditional_field(self, obj):
# do your conditional logic here
# and return appropriate result
return obj