How to get lookup_url_kwarg in serializer of django rest framework

Viewed 3806

this my Django view

class CreateForeignTableView(CreateAPIView):
"""
create foreign_table finally not difference a normal table ??
"""
serializer_class = CreateForiegnTableSerializer
queryset = None
lookup_url_kwarg = 'foreign_server_id'

I want get lookup_url_kwarg in my create serializer function

3 Answers

Simple you can override create method to achieve this.

    def create(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data, context={
            'request': request,
            'id': self.kwargs.get(self.lookup_url_kwarg)})
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)

In the serializer, you can use id = self.context['id']

You can override get_serializer_context method to achieve this.

class CreateForeignTableView(CreateAPIView):
    """
    create foreign_table finally not difference a normal table ??
    """
    serializer_class = CreateForiegnTableSerializer
    queryset = None
    lookup_url_kwarg = 'foreign_server_id'

    def get_serializer_context(self):
        context = super(CreateForeignTableView, self).get_serializer_context()
        context.update({
            "foreign_server_id": self.kwargs.get(self.lookup_url_kwarg)
        })
        return context

In the serializer you can use self.context.get("foreign_server_id", "") to get foreign_server_id.

You can follow this post to know farther.

You only need to access the serializer context. GenericApiView sets the view itself into the serializer context, so you may access lookup_url_kwarg like this:

def create(self, validated_data):
    my_url_kwarg = self.context['view'].lookup_url_kwarg
Related