Django NestedHyperlinkedModelSerializer не возвращает поле внешнего ключа

Родительский id или внешний ключ не возвращается из дочернего. Я пытаюсь drf-nested-routers example.

models.py

class Client(models.Model):
    name = models.CharField(max_length=255)


class MailDrop(models.Model):
    title = models.CharField(max_length=255)
    client_id = models.ForeignKey(Client, on_delete=models.CASCADE)

serializers.py

class ClientSerializer(HyperlinkedModelSerializer):
    class Meta:
        model = Client
        fields = ['id', 'name']


class MailDropSerializer(NestedHyperlinkedModelSerializer):
    parent_lookup_kwargs = {
        'client_pk': 'client_id',
    }

    class Meta:
        model = MailDrop
        fields = ['id', 'title']

views.py

class ClientViewSet(viewsets.ViewSet):
    serializer_class = ClientSerializer

    def list(self, request):
        queryset = Client.objects.filter()
        serializer = ClientSerializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, pk=None):
        queryset = Client.objects.filter()
        client = get_object_or_404(queryset, pk=pk)
        serializer = ClientSerializer(client)
        return Response(serializer.data)


class MailDropViewSet(viewsets.ViewSet):
    serializer_class = MailDropSerializer

    def list(self, request, client_pk=None):
        queryset = MailDrop.objects.filter(client_id=client_pk)
        serializer = MailDropSerializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, pk=None, client_pk=None):
        queryset = MailDrop.objects.filter(pk=pk, client_id=client_pk)
        maildrop = get_object_or_404(queryset, pk=pk)
        serializer = MailDropSerializer(maildrop)
        return Response(serializer.data)

Если я добавляю fields = ['id', 'title', 'client_id'] в MailDropSerializer, возникает следующая ошибка:

AssertionError: `NestedHyperlinkedRelatedField` requires the request in the serializer context. Add `con
text={'request': request}` when instantiating the serializer.

Если я добавляю запрос в контекст сериализатора, вывод выглядит следующим образом:

url: http://127.0.0.1:8000/clients/4/maildrops/


[
    {
        "id": 3,
        "title": "Madison Mosley",
        "client_id": "http://127.0.0.1:8000/clients/4/"
    },
    {
        "id": 4,
        "title": "Louis Chen",
        "client_id": "http://127.0.0.1:8000/clients/4/"
    }
]

Я добавил контекст сериализатора следующим образом:

def list(self, request, client_pk=None):
        queryset = MailDrop.objects.filter(client_id=client_pk)
        serializer_context = {
            'request': request
        }
        serializer = MailDropSerializer(
            queryset, many=True, context=serializer_context)
        return Response(serializer.data)

Я пытаюсь получить нечто следующее:

[
    {
        "id": 3,
        "title": "Madison Mosley",
        "client_id": 4
    },
    {
        "id": 4,
        "title": "Louis Chen",
        "client_id": 4
    }
]

Только что решил:

class MailDropSerializer(NestedHyperlinkedModelSerializer):
    parent_lookup_kwargs = {
        'client_pk': 'client_id',
    }

    client_id = IntegerField(source='client_id.id')


    class Meta:
        model = MailDrop
        fields = ['id', 'title', 'client_id']
Вернуться на верх