为什么DRF响应中没有显示“url”

2024-04-29 11:18:44 发布

您现在位置:Python中文网/ 问答频道 /正文

HyperlinkedModelSerializer中使用url时,无法返回它

# 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",
        )

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

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

如果我使用reverse检查HyperlinkedRelatedField中的view_name是否存在,它将打印正确的URL

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


Tags: instancenamepyselfurlgetmodelsrequest
1条回答
网友
1楼 · 发布于 2024-04-29 11:18:44

要获取当前对象的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",
        )

相关问题 更多 >