【问题标题】:image field url changes as soon as I override list method in Django viewsets一旦我在 Django 视图集中覆盖列表方法,图像字段 url 就会更改
【发布时间】:2015-09-11 11:45:39
【问题描述】:

我是 python 和 django 的新手。我在模型中添加了一个图像字段...

class Entry(models.Model):
  title = models.CharField(max_length=255)
  body = MarkdownField()
  image = models.ImageField(upload_to='images',null=True,blank=True)

然后,当我编写如图所示的简单 django 休息视图时,它工作正常。

class EntryView(viewsets.ModelViewSet):
    queryset = Entry.objects.all()
    serializer_class = EntrySerializer

这里,django rest API 中的 image 字段显示如下:

"图片": "http://localhost:8000/media/images/x_4.jpg",

现在,当我在视图中覆盖列表方法时,服务器 url 部分即“http://localhost:8000”消失了,剩下的就剩下了。 我提到的新观点是:

class EntryView(viewsets.ModelViewSet):
    queryset = Entry.objects.all()
    serializer_class = EntrySerializer
    lookup_field = 'title'

    def list(self, request,*kwargs):
        queryset=Entry.objects.filter(publish=True)
        serializer = EntrySerializer(queryset,many=True)
        return Response(serializer.data)

我提到的 django rest API 中的 image 字段变成了这样:

"图片": "/media/images/x_4.jpg",

当我覆盖列表方法时,我想要 API 中图像字段中的完整 URL。

帮助!

【问题讨论】:

    标签: python django image rest


    【解决方案1】:

    默认情况下,ModelViewSet 将请求传递给您的序列化程序,因此序列化程序可以根据当前域构建 URL。没有请求,EntrySerializer 不知道域,所以它正在创建无域 URL。

    您可以通过多种方式修复它:

    1. 不要覆盖list 方法,而是像这样覆盖get_queryset:

      class EntryView(viewsets.ModelViewSet):
          queryset = Entry.objects.all()
          serializer_class = EntrySerializer
          lookup_field = 'title'
      
          def get_queryset(self):
              return super(EntryView, self).filter(publish=True)
      
    2. 使用ModelViewSet的get_serializer方法,而不是直接使用EntrySerializer:

      class EntryView(viewsets.ModelViewSet):
          queryset = Entry.objects.all()
          serializer_class = EntrySerializer
          lookup_field = 'title'
      
          def list(self, request,*kwargs):
              queryset=Entry.objects.filter(publish=True)
              serializer = self.get_serializer(queryset,many=True)
              return Response(serializer.data)
      
    3. 将包含当前请求的字典传递到序列化程序的上下文 kwarg 中:

      class EntryView(viewsets.ModelViewSet):
          queryset = Entry.objects.all()
          serializer_class = EntrySerializer
          lookup_field = 'title'
      
          def list(self, request,*kwargs):
              queryset=Entry.objects.filter(publish=True)
              serializer = EntrySerializer(queryset,many=True, context={'request': request})
              return Response(serializer.data)
      

    第一种方法最推荐,最后一种方法最不推荐,因为ModelViewSet内部的默认方法比较多,不受list方法内部变化的影响。此外,默认情况下,序列化程序内部还有更多默认变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2021-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-24
      相关资源
      最近更新 更多