Почему в ответе DRF не отображается `url` - PullRequest
2 голосов
/ 24 апреля 2020

Я не могу получить url для возврата при использовании его в HyperlinkedModelSerializer.

# models.py
class Promotion(TimeStampedMixin, models.Model):
    name = models.CharField(max_length=300)
    # ...


# views.py
class PromotionViewSet(viewsets.ModelViewSet):
    serializer_class = PromotionSerializer
    queryset = Promotion.objects.all()

    def retrieve(self, request, *args, **kwargs):
        instance = self.get_object()
        serializer = self.get_serializer(instance, context={'request': request})
        return Response(serializer.data)

# serializers.py
class PromotionSerializer(serializers.HyperlinkedModelSerializer):
    url = serializers.HyperlinkedRelatedField(
        view_name="campaigns:promotion-detail", read_only=True
    )

    class Meta:
        model = Promotion
        fields = (
            "url",
            "id",
            "name",
        )

Вывод JSON, который я получаю при запросе curl -X GET http://localhost/api/promotion/2/:

{"id":2,"name":"My promotion"}

Если я использую reverse, чтобы проверить, существует ли view_name в HyperlinkedRelatedField, он печатает правильный URL-адрес.

Мой вопрос: почему не отображается url в ответ? Это работает для любых других моих представлений (сравнение кода с классами, которые работают, не помогло). Прочитайте документацию по DRF, но я не вижу ничего нового (используется версия 3.11.0)

1 Ответ

5 голосов
/ 28 апреля 2020

Чтобы получить представление URL для текущего объекта, вы должны использовать HyperlinkedIdentityField

class PromotionSerializer(serializers.HyperlinkedModelSerializer):
    url = <b>serializers.HyperlinkedIdentityField</b>(
        view_name="campaigns:promotion-detail", read_only=True
    )

    class Meta:
        model = Promotion
        fields = (
            "url",
            "id",
            "name",
        )
...