为什么“url”没有出现在 DRF 响应中

kun*_*mbi 2 python django django-rest-framework

我不能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",
        )
Run Code Online (Sandbox Code Playgroud)

查询时收到的 JSON 输出curl -X GET http://localhost/api/promotion/2/

{"id":2,"name":"My promotion"}
Run Code Online (Sandbox Code Playgroud)

如果我使用reverse检查,如果view_nameHyperlinkedRelatedField存在,它打印正确的URL。

我的问题是:为什么没有url出现在响应中?它适用于我的所有其他视图(将代码与有效的类进行比较并没有帮助)。阅读 DRF 文档,但我没有看到任何新内容(使用版本 3.11.0)

dre*_*c4s 5

要获取当前对象的 url 表示,您应该使用HyperlinkedIdentityField

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

    class Meta:
        model = Promotion
        fields = (
            "url",
            "id",
            "name",
        )
Run Code Online (Sandbox Code Playgroud)