Django Rest Framework upload_to работает не так, как хотелось бы

Я передаю callable для поля image в моем проекте следующим образом

def profile_picture_path(instance, filename):
    """Path for uploading profile pictures in media directory"""
    return f"user/profile_picture/{instance.pk}/{filename}"

class User(AbstractUser):
    profile_picture = models.ImageField(_("profile picture"),
                                        upload_to=profile_picture_path,
                                        null=True,
                                        blank=True)

Когда я добавляю пользователя через админ панель, изображение получает правильный путь: user/profile_picture/3/pfp.png. Проблема возникает, когда я отправляю пост-запрос для регистрации: user/profile_picture/None/pfp.png

# views.py

@api_view(["POST"])
def register_view(request):
    """
    Register View which takes only post method.
    """
    serializer = UserSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    else:
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
# serializers.py

class UserSerializer(serializers.ModelSerializer):
    def __init__(self, *args, **kwargs):
        exclude = kwargs.pop("exclude", None)
        super().__init__(*args, **kwargs)

        if exclude is not None:
            for field_name in exclude:
                self.fields.pop(field_name)

    password = serializers.CharField(write_only=True)

    class Meta:
        model = User
        exclude = ["deleted", "deleted_by_cascade"]

Как я могу исправить это и получить правильный путь для загрузки изображений?

Комментарий от Smit Parmar верен, но он не решает ваш вопрос. Сначала вы должны создать пользователя без изображения. После этого вы можете сохранить пользователя с изображением.

Причина - ваш специальный профиль_путь_изображения.

Если вы можете сохранить изображение не в папке ID пользователя, это работает нормально.

Вернуться на верх