Django DRF序列化程序删除imagefield绝对url

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

在DRF中,现在如果我保存图像,
序列化程序将为我提供具有绝对路径的图像。但在我的场景中,我不想要绝对路径。我只需要一个图像路径,这是在那里的数据库。在我的场景中,我正在用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,而不是再次查询和序列化它。下面的方法将起作用

通常,对于ImageFieldFileField将返回名称,但在DRF中,它已转换为url以供使用。所以你只需要改变一下,就这样

在serailizer中,只需如下所示指定:

Field_name = serializers.ImageField(use_url=False)
因此,此行将在保存更新后将绝对url转换为名称作为响应


如需进一步参考,请参阅此

上面的答案适用于列表和检索方法,但我需要添加post和检索,而不是再次查询和序列化它。下面的方法将起作用

通常,对于ImageFieldFileField将返回名称,但在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()