获取DRF中图像的绝对路径

问题描述 投票:0回答:2

我最近正在接触 drf,我想创建一个返回用户信息的系统。在各个字段中,用户有一个头像,它应该返回保存照片的 URL。问题是我得到的是相对路径而不是绝对路径。下面我附上我的应用程序的代码。

模型.py

def get_upload_path(instance, filename):
    return os.path.join('images' , 'avatar' , str(instance.pk),filename)
    
class CustomUser(AbstractUser):
    username = models.CharField(max_length=50, unique=True)
    email = models.EmailField(_('email address'), unique=True)
    name = models.CharField(max_length=50)
    surname = models.CharField(max_length=50)
    avatar = models.ImageField(upload_to=get_upload_path, blank=True, null=True,)
    is_active = models.BooleanField(default=True)
    is_verified = models.BooleanField(default=False)
    date_joined = models.DateTimeField(_('date joined'), auto_now_add=True)
    last_login = models.DateTimeField(_('last login'), auto_now=True)

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email']  

    def __str__(self):
        return self.username

序列化器.py

class CustomUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = CustomUser
        fields = ['id','username','email','name','surname','avatar',]
        

views.py

class CustomUserAPIView(APIView):

    def get(self,request):
        serializer = CustomUserSerializer(request.user)
        return Response(serializer.data)

我得到的是这样的:

{
    "id": 1,
    "username": "admin",
    "email": "[email protected]",
    "name": "John",
    "surname": "Test",
    "avatar": "/media/images/avatar/1/photo.JPG"
}

但我需要得到的是这个

{
        "id": 1,
        "username": "admin",
        "email": "[email protected]",
        "name": "John",
        "surname": "Test",
        "avatar": "http://127.0.0.1:8000/media/images/avatar/1/photo.JPG"
}

我该如何解决?先谢谢您的回复

python image django-models django-rest-framework django-serializer
2个回答
0
投票

使用文件字段上可用的

url
属性;您可以使用
source
轻松地完成它。

class CustomUserSerializer(serializers.ModelSerializer):
    avatar = serializers.CharField(source="avatar.url")

    class Meta:
        model = CustomUser
        fields = [
            "id",
            "username",
            "email",
            "name",
            "surname",
            "avatar",
        ]

-1
投票

也许你可以使用

__file__
变量(假设 models.py 位于同一目录中):

def get_upload_path(instance, filename):
    return os.path.join(os.path.dirname(__file__), 'images' , 'avatar' , str(instance.pk),filename)
© www.soinside.com 2019 - 2024. All rights reserved.