Django Rest Framework - 标记额外的路由操作

use*_*821 5 django django-rest-framework

我有我的 API 的下一个视图

class CapsuleViewSet(viewsets.ModelViewSet):

    queryset = Capsule.objects.all()
    serializer_class = CapsuleSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

    @action(detail=True)
    def modules(self, request, pk=None):

        capsule = self.get_object()
        capsule_modules = Module.objects.filter(capsule=capsule)
        serializer = ModuleSerializer(capsule_modules, many=True)
        return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)

当我尝试获取与胶囊相关的所有模块时,模块的 imageField 的 URL 不完整。

当我调用http://0.0.0.0:8000/api/capsules/1/它返回:

{
    "capsuleID": 1,
    "capsuleName": "sdfads",
    "capusuleDetails": "asdf",
    "capsuleImageURL": "http://0.0.0.0:8000/media/capsulas/logocitbm.png",
    "userStars": 0,
    "pallete": {
        "palleteID": 1,
        "palleteName": "Default smartraining",
        "colors": [
            {
                "colorID": 1,
                "colorName": "A1",
                "colorCode": "#sdfs"
            },
            {
                "colorID": 2,
                "colorName": "A2",
                "colorCode": "#dsfksdoif"
            },
            {
                "colorID": 3,
                "colorName": "A3",
                "colorCode": "#sdjfjgioj"
            }
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我调用http://0.0.0.0:8000/api/capsules/1/modules/我得到:

[
    {
        "moduleID": 1,
        "moduleName": "sdfa",
        "moduleDetails": "así",
        "moduleImageURL": "/media/modulos/9_-_4._Detalle_C%C3%A1psula.png",
        "userScore": 0
    }
]
Run Code Online (Sandbox Code Playgroud)

moduleImageURL 不完整,为什么?这些是我的序列化程序:

class CapsuleSerializer(serializers.ModelSerializer):

    pallete = PalleteSerializer(read_only=True)

    class Meta:
        model = Capsule
        fields = ('capsuleID', 'capsuleName', 'capusuleDetails', 'capsuleImageURL', 'userStars', 'pallete')

class ModuleSerializer(serializers.ModelSerializer):

    class Meta:
        model = Module
        fields = ('moduleID', 'moduleName', 'moduleDetails', 'moduleImageURL', 'userScore')
Run Code Online (Sandbox Code Playgroud)

use*_*821 3

经过一些研究,我发现我需要将上下文传递给 ModelSerializer,如下所示:

serializer = ModuleSerializer(capsule_modules, many=True, context={'request': request})
Run Code Online (Sandbox Code Playgroud)