【问题标题】:Return image url in Django Rest Framework在 Django Rest Framework 中返回图像 url
【发布时间】:2014-10-15 10:08:01
【问题描述】:

我正在使用 Django Rest Framework 并具有以下模型:

class Picture(models.Model):
    some_field = models.ForeignKey(some_model)
    image = models.ImageField()

我想编写一个 GET 端点来返回图像的 url。这是我到目前为止所做的

def get(self, request, aid):
    '''
    Get Image
    '''
    try:
        picture = Picture.objects.filter(some_field=aid)
    except Picture.DoesNotExist:
        raise Http404

    serialiser = PictureSerialiser(picture)
    return Response(serialiser.data)

和我的序列化器如下:

class PictureSerialiser(serializers.ModelSerializer):

    class Meta:
        model = Picture
        fields = ('field', 'image')

如何确保回复是{field:'Value here', image:'url to image'}

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    您可以使用这样的自定义序列化程序方法来做到这一点:

    class PictureSerialiser(serializers.ModelSerializer):
    
        image_url = serializers.SerializerMethodField('get_image_url')
    
        class Meta:
            model = Picture
            fields = ('field', 'image', 'image_url')
    
        def get_image_url(self, obj):
            return obj.image.url
    

    【讨论】:

    • 这需要改变模型吗?因为在尝试测试时,我得到了'QuerySet' object has no attribute 'image_url''QuerySet' object has no attribute 'image'
    • 不,这不需要更改模型。因为这是一个模型序列化器,你的模型上有这些字段,它应该可以工作。
    【解决方案2】:

    提供的答案都是正确的,但我想在答案中添加一点,这是一种返回文件路径的方法,包括网站地址。为此,我们从请求本身获得帮助:

    class PictureSerialiser(serializers.ModelSerializer):
    
        image_url = serializers.SerializerMethodField('get_image_url')
    
        class Meta:
            model = Picture
            fields = ('field',
                      'image',
                      'image_url')
    
        def get_image_url(self, obj):
            request = self.context.get("request")
            return request.build_absolute_uri(obj.image.url)
    

    【讨论】:

    • 太棒了!。正是我正在寻找的没有这种方法,我正在做这样的事情 ============> return SomeModel_Serializer(model_instance, context=self.context).data["image"]
    【解决方案3】:

    目前为止最好的方法

    您必须像这样获取图像的路径 image_field: "media/path/to/your/image.jpg"

    但你真正想要的回应是 image_field: "http://localhost/media/path/to/your/image.jpg"

    步骤:1 在您的模型中,在字段中提供属性“upload_to”:

    #models.py
    YourModel(models.Model):
        image_field = models.ImageField(upload_to='images/', null = True)
    

    步骤:2 在 settings.py 中添加它,它将确保为您的所有图像创建一个媒体目录

     #settings.py
        MEDIA_ROOT  = os.path.join(BASE_DIR, 'media')
        MEDIA_URL = '/media/'
    

    步骤:3 将配置添加到您的 urls.py。它将确保您的图片可以通过 url 访问。

     #urls.py 
        from django.conf import settings
        from django.conf.urls.static import static
        
        urlpatterns = [
            ...#some paths  
        ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    

    步骤:4 在您的序列化程序中添加这些行 #serializers.py

     class YourModelSerializer(serializers.ModelSerializer):
       
        class Meta:
            model = models.YourModel
            fields = '__all__'
    
        #This is the magic function which does the work
        def get_photo_url(self, obj):
            request = self.context.get('request')
            photo_url = obj.fingerprint.url
            return request.build_absolute_uri(photo_url)
    

    您可能想知道 "context", "request", "obj" ,这在第 5 步中会有意义

    步骤:5 现在,在您的 Views.py 中,我们必须向 Serializer 提供请求、上下文。

    #views.py
    class YourModelView(APIVIew):
          def get(self, request, format=None):
            queryset = models.YourModel.objects.all()
            serializer = serializers.YourModelSerializer(queryset, context={"request": 
                          request}, many=True)
            return Response(serializer.data) 
    

    执行这些步骤后,您将在响应中获得所需的 image_url

    祝你有个愉快的一天!!!

    【讨论】:

      【解决方案4】:
      def get(self, request, aid):
      '''
      Get Image
      '''
      try:
          picture = Picture.objects.filter(some_field=aid)
      except Picture.DoesNotExist:
          raise Http404
      
      serialiser = PictureSerialiser(picture, context={'request': request}) # Code Added here
      return Response(serialiser.data)
      

      在您的获取视图中添加context={'request': request}。它可能工作正常。我的代码正在运行,我得到了 Image 的完整 url。 DRF Docs

      【讨论】:

        【解决方案5】:

        将序列化程序中的图像字段更新为use_url=True 对我有用:

        class PictureSerialiser(serializers.ModelSerializer):
            image = serializers.ImageField(
                    max_length=None, use_url=True
                )
            class Meta:
                model = Picture
                fields = ('field', 'image')
        

        我无法获得当前接受的答案(将自定义 get_image_url 方法添加到序列化程序)以在 Django 2.2 中工作。我收到需要更新模型以包含字段 image_url 的错误消息。即使在更新模型后它也无法正常工作。

        【讨论】:

          【解决方案6】:

          serializers.py

          class ListImageSerializer(serializers.ModelSerializer):
          
              class Meta:
                  model = UploadImg
                  fields = [
                      'id',
                      'image'
                  ]
          

          views.py

          class ListImageAPIView(generics.ListAPIView):
          
          serializer_class = ListImageSerializer
          queryset = UploadImg.objects.all()
          permission_classes = [IsAuthenticated] 
          
              def get(self, request, format=None):
                  imgobj = UploadImg.objects.all()
                  serializer = ListImageSerializer(imgobj, many=True, context= 
                  {'request': request})
          
                  return Response({
                      'status' : True,
                      'message' : 'Image List',
                      'images' : serializer.data})
          

          只需在您的 views.py 文件的序列化器对象中添加 context= {'request': request}) 行,您就可以开始了

          Response

          {
          "status": true,
          "message": "Image List",
          "images": [
              {
                  "id": 1,
                  "image": "http://192.168.1.24:8000/media/images/emoji_7Om0yz7.png"
              }
          ]
          }
          

          【讨论】:

            猜你喜欢
            • 2016-05-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-04-09
            • 2020-12-16
            • 1970-01-01
            • 2019-08-19
            相关资源
            最近更新 更多