Как сериализовать поле файла без хоста

У меня есть поле файла

class Document(models.Model):
    generated_document = models.FileField( # документ, который создала Celery из шаблона
        upload_to='generated_files/',
        blank=True,
        null=True
    )
    ...

Я сериализую это поле следующим образом

class DocumentSerialize(serializers.ModelSerializer): class Meta: модель = Документ поля = ["generated_document", ...]

Я хочу иметь это /media/generated_files/expense_contract_2022-07-17-20-02-51.pdf

Но у меня есть результат с хостом http://<HOST>/media/generated_files/expense_contract_2022-07-17-20-02-51.pdf

Я знаю о SerializerMethodField, но как правильно удалить хост в сериализаторе?

В urls.py я использую

if settings.DEBUG:
    urlpatterns += static(
        settings.MEDIA_URL, document_root=settings.MEDIA_ROOT
    )

Вы можете создать свой собственный FileField и затем работать с ним вместо этого, так:

from rest_framework.fields import FileField
from rest_framework.settings import api_settings

class FileWithoutHostField(FileField):
    def to_representation(self, value):
        if not value:
            return None

        use_url = getattr(self, 'use_url', api_settings.UPLOADED_FILES_USE_URL)
        if use_url:
            try:
                return value.url
            except AttributeError:
                return None
        return value.name

Теперь вы можете ввести FileWithoutHostField в serializer_field_mapping [drf-doc], чтобы использовать это вместо FileField, так:

from django.db.models import fields
from django_rest.serializers import ModelSerializer

ModelSerializer.serializer_field_mapping[fields.FileField] = FileWithoutHostField
Вернуться на верх