在DRF中获取图片的绝对路径

2 投票
2 回答
27 浏览
提问于 2025-04-13 01:09

我最近在学习DRF(Django REST框架),想要创建一个系统来返回用户的信息。在这些信息中,有一个用户头像,它应该返回保存照片的URL链接。问题是,我得到的是一个相对路径,而不是绝对路径。下面我附上了我应用的代码。

models.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

serializers.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": "test@gmail.com",
    "name": "John",
    "surname": "Test",
    "avatar": "/media/images/avatar/1/photo.JPG"
}

但我需要的是这个:

{
        "id": 1,
        "username": "admin",
        "email": "test@gmail.com",
        "name": "John",
        "surname": "Test",
        "avatar": "http://127.0.0.1:8000/media/images/avatar/1/photo.JPG"
}

我该如何解决这个问题呢?提前感谢你的回复。

2 个回答

0

UPLOADED_FILES_USE_URL 这个设置改成 True

# settings.py

# …

REST_FRAMEWORK = {
    'UPLOADED_FILES_USE_URL': True,
    # …
}
1

使用 url 属性,这个属性在文件字段(FileFields)上是可以用的,图片字段(ImageFields)也是如此;你可以通过 field.source 很方便地获取它。

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

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

撰写回答