Не полный путь к изображениям MEDIA

Есть 2 класса которые использую, первый для вывода всех возможных достижений

class UserAchievementViewSet(ModelViewSet):
    queryset = UserAchievement.objects.all().order_by('-id')
    serializer_class = UserAchievementSerializer
    permission_classes = (IsAdminUser, )

а второй для вывода достижений пользователя

class UserAchievementStatusListApiView(ListAPIView):
    serializer_class = UserAchievementStatusSerializer
    pagination_class = None
    permission_classes = (IsAuthenticated,)

    def get_queryset(self):
        return UserAchievementStatus.objects.all()

    def list(self, request, *args, **kwargs):
        queryset = self.get_queryset().filter(user=request.user)
        serializer = self.serializer_class(queryset, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

Вот 2 сериализатора:

class UserAchievementSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserAchievement
        fields = ('id', 'name', 'description', 'final_value', 'given_exp', 'image')


class UserAchievementStatusSerializer(serializers.ModelSerializer):
    achievement = UserAchievementSerializer(read_only=True)

    class Meta:
        model = UserAchievementStatus
        fields = ('achievement', 'progress_right_now', 'is_achieved')

Для ясности привожу модель

class UserAchievementStatus(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    achievement = models.ForeignKey(UserAchievement, on_delete=models.CASCADE)
    progress_right_now = models.SmallIntegerField(default=0)
    is_achieved = models.BooleanField(default=False)

И вот в чем ошибка, когда хочу получить атчивки юзера путь к img строится не совсем корректно

GET /api/get_user_achievements/
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

[
    {
        "achievement": {
            "id": 9,
            "name": "Тест1",
            "description": "ну тест1",
            "final_value": 1,
            "given_exp": 12,
            "image": "/media/users/achievements/achiv_WU6ONnk.jpg"
        },
        "progress_right_now": 0,
        "is_achieved": false
    },
    {
        "achievement": {
            "id": 10,
            "name": "Тест2",
            "description": "ну тест2",
            "final_value": 1,
            "given_exp": 11,
            "image": "/media/users/achievements/base_fmPUN1S.jpg"
        },
        "progress_right_now": 0,
        "is_achieved": false
    }
]

Хотя когда просто вывожу все достижения, путь к img верный

GET /api/achievements/
HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "count": 2,
    "next": "http://127.0.0.1:8000/api/achievements/?page=2",
    "previous": null,
    "results": [
        {
            "id": 10,
            "name": "Тест2",
            "description": "ну тест2",
            "final_value": 1,
            "given_exp": 11,
            "image": "http://127.0.0.1:8000/media/users/achievements/base_fmPUN1S.jpg"
        }
    ]
}

В чем может быть ошибка и как ее исправить?

Ошибка была в том, что при сериализации ответа я не указывал request в context вот как должно быть:

    def list(self, request, *args, **kwargs):
        queryset = self.get_queryset().filter(user=request.user)
        filter_queryset = self.filter_queryset(queryset)
        serializer = self.serializer_class(filter_queryset, many=True, context={'request': request})
        return Response(serializer.data, status=status.HTTP_200_OK)

Back to Top