Django REST框架序列化程序

时间:2015-11-05 13:46:05

标签: python django url django-rest-framework serializer

我有一个带有FileField的模型和这个模型的序列化器,包括文件字段。在我的视图集中,序列化程序为文件字段写入一个完整的URL(一个以http://开头),而不指定任何内容。但是,如果我手动调用序列化程序,则url从/ media。

开始

这是一个小代码:

class ArtworkView(viewsets.ModelViewSet):
    """
    View that handle Artwork
    """
    queryset = Artwork.objects.all()
    serializer_class = ArtworkSerializer
    permission_classes = (
        permissions.IsAuthenticatedOrReadOnly,
        IsArtistOrReadOnly,
    )

    def list(self, request, *args, **kwargs):
        pass

由于"http://testserver/media/file.jg" != "/media/file.jpg"

而导致崩溃的测试
def test_list(self):
        artworks = Artwork.objects.all()
        artworks_serialized = ArtworkSerializer(artworks, many=True)

        artwork = self.create_artwork()
        request = self.factory.get('/api/v1/artworks/')
        view = ArtworkView.as_view({'get': 'list'})
        resp = view(request)

        self.assertEqual(resp.status_code, 200)
        self.assertListEqual(resp.data, artworks_serialized.data) #crashes

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

原因是您的序列化超出了请求的范围。 默认情况下,它们将在序列化程序上下文中传递,因为它们是HyperLinked数据所必需的。

您应该使用RequestFactory创建一个虚假请求并将其传递给序列化程序的上下文:

ng-pattern