DRF将url更改为绝对url

moh*_*moh 1 python django django-rest-framework

我上传了一些文件到服务器你可以看到地址:

\n\n

其结果是:

\n\n
 "product_video": [\n            {\n                "product": 12,\n                "name": "backup",\n                "file": "/upload/user_1/backup.zip",\n                "video_length": null,\n                "is_free": false\n            },\n            {\n                "product": 12,\n                "name": "backup",\n                "file": "/upload/user_1/backup_9um5Gwm.zip",\n                "video_length": null,\n                "is_free": false\n            }\n        ]\n
Run Code Online (Sandbox Code Playgroud)\n\n

"file": "/upload/user_1/backup.zip",

\n\n

你能告诉我如何将其更改为绝对网址,例如:

\n\n

localhost:8000/upload/user_1/backup.zip",

\n\n

我们有一些函数 linke 在 django 中获取绝对 url 我不关心 drf

\n\n

它是我的序列化器类:

\n\n
class ProductSerializer(ModelSerializer):\n    product_ratings = ProductRatingsSerializer(many=True, read_only=True)\n    product_video = ProductVideoSerializer(many=True, read_only=True)\n    author = serializers.SerializerMethodField()\n\n    def get_author(self, obj):\n        return obj.author.first_name + \' \' + obj.author.last_name\n\n    def get_category(self, obj):\n        return obj.category.title\n\n\n    class Meta:\n        model = Product\n        fields = [\n            \'product_id\',\n            \'author\',\n            \'title\',\n            \'mini_description\',\n            \'you_learn\',\n            \'you_need\',\n            \'full_description\',\n            \'price\',\n            \'video_level\',\n            \'video_length\',\n            \'created_date\',\n            \'updated_date\',\n            \'product_ratings\',\n            \'product_video\'\n        ]\n        read_only_fields = [\'product_id\', \'created_date\', \'updated_date\', \'author\',\n                            \'product_ratings\']\n\n    def validate_title(self, value):\n        if self.context[\'request\']._request.method == \'POST\':\n            qs = Product.objects.filter(title__iexact=value)\n            if self.instance:\n                qs.exclude(pk=self.instance.pk)\n            if qs.exists():\n                raise serializers.ValidationError("this title is already used")\n        return value\n
Run Code Online (Sandbox Code Playgroud)\n\n

产品视频序列化器: \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c

\n\n
class ProductVideoSerializer(ModelSerializer):\n    class Meta:\n        model = ProductVideo\n        fields = [\n            \'product\',\n            \'name\',\n            \'file\',\n            \'video_length\',\n            \'is_free\',\n        ]\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2 \x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80 \x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2 \x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80 \x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2 \x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80\x8c \xe2\x80 \x8c \xe2\x80\x8c \xe2\x80\x8c

\n

Abd*_*P M 5

SerializerMethodField您可以在课堂上使用 a ProductVideoSerializer

class ProductVideoSerializer(ModelSerializer):
    file_abs_url = serializers.SerializerMethodField()

    class Meta:
        model = ProductVideo
        fields = [
            'product',
            'name',
            'file_abs_url',
            'video_length',
            'is_free',
        ]
    def get_file_abs_url(self, obj):
        request = self.context.get('request')
        return request.build_absolute_uri(obj.file.url)
Run Code Online (Sandbox Code Playgroud)