我最近正在接触 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"
}
我该如何解决?先谢谢您的回复
使用文件字段上可用的
url
属性;您可以使用 source
轻松地完成它。
class CustomUserSerializer(serializers.ModelSerializer):
avatar = serializers.CharField(source="avatar.url")
class Meta:
model = CustomUser
fields = [
"id",
"username",
"email",
"name",
"surname",
"avatar",
]
也许你可以使用
__file__
变量(假设 models.py 位于同一目录中):
def get_upload_path(instance, filename):
return os.path.join(os.path.dirname(__file__), 'images' , 'avatar' , str(instance.pk),filename)