无法获取图像字段Django Rest的完整url

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

我有两个序列化器:

class AlbumImageSerializer(serializers.ModelSerializer):
    url = serializers.SerializerMethodField('get_url')

    def get_url(self, obj):
        return obj.image.url

    class Meta:
        model = AlbumImage
        fields = ['id', 'url']

class PhotoAlbumSerializer(serializers.ModelSerializer):
    photos = AlbumImageSerializer(many=True, read_only=True)

    class Meta:
        model = PhotoAlbum
        fields = ('id', 'name', 'photos')

我读到要显示图像的完整 url,将请求上下文传递给序列化器调用就足够了,例如:

serialized = SomeSerializer(some, context={"request": request})

当你使用

ViewSet
时,你不需要做任何事情,DRF将在初始化序列化器时自动传递请求上下文。

我正在使用 ViewSets,例如:

class PhotoAlbumViewSet(mixins.CreateModelMixin,
                        mixins.ListModelMixin,
                        GenericViewSet):
    serializer_class = PhotoAlbumSerializer

但我的获取请求仍然返回如下响应:

"url": "/media/images/photo.jpg"

我怎样才能得到

"url": "127.0.0.1:8000/media/images/photo.jpg"

就我而言?

我的模特

class PhotoAlbum(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, auto_created=True)
    name = models.CharField(max_length=50, verbose_name='Pet name')

class AlbumImage(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, auto_created=True)
    album = models.ForeignKey(PhotoAlbum, on_delete=models.CASCADE, related_name='photos')
    image = models.ImageField(upload_to='images/', height_field=None, width_field=None, max_length=100, blank=True)

另一个端点,其中 print

url
返回类似
127.0.0.1:8000/media/UUID/photo.jpg
:

的响应
@action(methods=['post'], detail=True)
def photo(self, request, pk):
    file = request.data['file']
    album = PhotoAlbum.objects.get(pk=pk)
    alb_img = AlbumImage(album=album, image=file)
    alb_img.save()
    return Response({'id': pk,
                     'url': alb_img.image)})
python django django-rest-framework django-serializer
2个回答
2
投票

只是不要尝试覆盖 url 字段,让框架为您处理它:

序列化器.py

class AlbumImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.AlbumImage
        fields = ['id', 'url']

class PhotoAlbumSerializer(serializers.ModelSerializer):
    photos = AlbumImageSerializer(many=True, read_only=True)

    class Meta:
        model = models.Pet
        fields = ('id', 'name', 'photos')

示例输出:

[
    {
        "id": 1,
        "name": "Pet name.",
        "photos": [
            {
                "id": 2,
                "url": "http://localhost:8000/media/random_image_one.png"
            },
            {
                "id": 3,
                "url": "http://localhost:8000/media/random_image_two.png"
            }
        ]
    }
]

0
投票

您只需将 request 对象传递给您的序列化器

serializer = ReviewSerializer(data=data, context={'request': request})

你会得到 enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.