Почему возникает ошибка при сериализации имени файла?

Сайт на Django.

Зависимые пакеты:

django 3.0.5
djangorestframework 3.11.0

При аплоаде файлов с определенными названиями сериалайзер выдаёт невалидность. Например такое название крашит сериализацию "2 Sub Urban ft. Rei Ami - Freak (Рус Кавер Oxygen1um ft. Lil Key) ▶ Песня На Русском - Оксигениум Перевод Rus Cover.mp4" (Я понимаю, что название слишком "хитровыделанное", но ничего не могу поделать - пользователи такое пытаются загрузить)

Код сериалайзера

class ClipVideoFileSerializer(serializers.ModelSerializer):
"""Clip VideoFile Serializer"""

class Meta:
    model = Clip
    fields = "__all__"
    read_only_fields = ('error', 'converted', 'is_playing', 'clip_duration',)

Код вьюхи

class ClipView(APIView):
"""Clip View"""

parser_classes = (MultiPartParser, FormParser, JSONParser)

object_serializer = ClipSerializer
object_get_serializer = ClipGetSerializer
video_file_serializer = ClipVideoFileSerializer
json_object_name = "clip"

"""

Часть несвязанного с проблемой кода скрыта

"""

def put(self, request):
    if request.data.get(self.json_object_name):

        """ Часть несвязанного с проблемой кода скрыта """

        """ При аплоаде выполняется блок elif """

    elif request.data.get("video_file") is not None and request.data.get("id") is not None:
        instance = get_object_or_404(Clip.objects.all(), pk=request.data.get("id"))

        """ Часть несвязанного с проблемой кода скрыта """

        file_serializer = self.video_file_serializer(
            instance=instance,
            data=request.data,
            partial=True
        )
        if file_serializer.is_valid():

            """ Часть несвязанного с проблемой кода скрыта """

        else:
            data = request.data
            return self.get(request, context={"detail": "update error", "id": data.get("id"),
                                              "convertation_status": "error"})
    else:
        return self.get(request, context={"error": "bad request"})

"""

Часть несвязанного с проблемой кода скрыта

"""

Модель

class Clip(models.Model):
    """Clip"""

    """ Часть несвязанного с проблемой кода скрыта """

    video_file = models.FileField("Clip", upload_to="clips", null=True, blank=True)

    """ Часть несвязанного с проблемой кода скрыта """

Если у файлов простые названия (например "video_bla_bla.mp4") то проблем с загрузкой не возникает.

Пытался при сохранении менять имя используя django-hashedfilenamestorage, но безрезультатно.

Есть возможность еще на фронте менять имя отправляемого файла, но это - костыль, ведь на бэке так и будет вероятность ошибки из-за имени.

Как мне решить эту проблему?


Ответы (1 шт):

Автор решения: Lexx Xell

Указать в модели длину имени файла

video_file = models.FileField("Clip", upload_to=get_new_video_file_path, null=True, blank=True, max_length=255)

по умолчания было 100

И не забывать в таких случаях, что у сериалайзера можно посмотреть ошибки:

print(file_serializer.errors)
→ Ссылка