我有一个带有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
感谢您的帮助!
答案 0 :(得分:2)
原因是您的序列化超出了请求的范围。 默认情况下,它们将在序列化程序上下文中传递,因为它们是HyperLinked数据所必需的。
您应该使用RequestFactory创建一个虚假请求并将其传递给序列化程序的上下文:
ng-pattern