Django DRF序列化程序删除imagefield绝对url
在DRF中,现在如果我保存图像,Django DRF序列化程序删除imagefield绝对url,django,django-models,django-rest-framework,Django,Django Models,Django Rest Framework,在DRF中,现在如果我保存图像,序列化程序将为我提供具有绝对路径的图像。但在我的场景中,我不想要绝对路径。我只需要一个图像路径,这是在那里的数据库。在我的场景中,我正在用json硬编码图像路径。所以我不能使用绝对路径。任何人都可以提出一些想法来实现它。您可以使用SerializerMethodField。通过执行以下操作,可以返回存储在数据库中的值: class YourSerializer(serializers.ModelSerializer): image=serializers.Seri
序列化程序将为我提供具有绝对路径的图像。但在我的场景中,我不想要绝对路径。我只需要一个图像路径,这是在那里的数据库。在我的场景中,我正在用json硬编码图像路径。所以我不能使用绝对路径。任何人都可以提出一些想法来实现它。您可以使用SerializerMethodField
。通过执行以下操作,可以返回存储在数据库中的值:
class YourSerializer(serializers.ModelSerializer):
image=serializers.SerializerMethodField()
def get_图像(自身、obj):
返回obj.image.file.name
文档:您可以使用SerializerMethodField
。通过执行以下操作,可以返回存储在数据库中的值:
class YourSerializer(serializers.ModelSerializer):
image=serializers.SerializerMethodField()
def get_图像(自身、obj):
返回obj.image.file.name
文档:创建自定义文件字段将解决此问题
class CustomFileField(serializers.FileField):
def to_representation(self, value):
if not value:
return None
if not getattr(value, 'path', None):
# If the file has not been saved it may not have a path.
return None
return value.path
class MyFooSerializer(serializers.ModelSerializer):
my_file_field = CustomFileField()
...
# other code
class CustomFileField(serializers.FileField):
def到_表示(自身、值):
如果不是值:
一无所获
如果不是getattr(值“路径”,无):
#如果文件尚未保存,则可能没有路径。
一无所获
返回值.path
类MyFooSerializer(serializers.ModelSerializer):
my_file_field=CustomFileField()
...
#其他代码创建自定义文件字段将解决此问题
class CustomFileField(serializers.FileField):
def to_representation(self, value):
if not value:
return None
if not getattr(value, 'path', None):
# If the file has not been saved it may not have a path.
return None
return value.path
class MyFooSerializer(serializers.ModelSerializer):
my_file_field = CustomFileField()
...
# other code
class CustomFileField(serializers.FileField):
def到_表示(自身、值):
如果不是值:
一无所获
如果不是getattr(值“路径”,无):
#如果文件尚未保存,则可能没有路径。
一无所获
返回值.path
类MyFooSerializer(serializers.ModelSerializer):
my_file_field=CustomFileField()
...
#上面的其他代码
用于list和retrieve方法,但我需要添加for post和retrieve,而不是再次查询和序列化它。下面的方法将起作用
通常,对于ImageField和FileField将返回名称,但在DRF中,它已转换为url以供使用。所以你只需要改变一下,就这样
在serailizer中,只需如下所示指定:
Field_name = serializers.ImageField(use_url=False)
因此,此行将在保存和更新后将绝对url转换为名称作为响应
如需进一步参考,请参阅此上面的答案适用于列表和检索方法,但我需要添加post和检索,而不是再次查询和序列化它。下面的方法将起作用
通常,对于ImageField和FileField将返回名称,但在DRF中,它已转换为url以供使用。所以你只需要改变一下,就这样
在serailizer中,只需如下所示指定:
Field_name = serializers.ImageField(use_url=False)
因此,此行将在保存和更新后将绝对url转换为名称作为响应
如需进一步参考,请参阅此我可以用于列出的内容,但保存和更新响应将不起作用。我也需要为此编写自定义序列化程序。还有其他解决方案吗?如果您不想使用Django提供的FileField功能,为什么不在您的模型中使用CharField呢?或者,您可以通过仅在序列化程序中指定CharField来实现这一点。由于FileField继承CharField,因此保存和加载应该没有问题image=serializers.CharField()
我可以用它来列出,但是保存和更新响应它不起作用。我也需要为此编写自定义序列化程序。还有其他解决方案吗?如果您不想使用Django提供的FileField功能,为什么不在您的模型中使用CharField呢?或者,您可以通过仅在序列化程序中指定CharField来实现这一点。由于FileField继承CharField,因此保存和加载应该没有问题image=serializers.CharField()