Сериализатор условных полей 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
Вернуться на верх