Как сериализовать поле файла без хоста
У меня есть поле файла
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