django-restframework序列化显示

时间:2014-12-19 11:44:38

标签: python django django-rest-framework

当用户转到http://127.0.0.1:8000/movies/时,我不想显示Showtimes 但是当用户转到http://127.0.0.1:8000/movies/1/时,请显示它。

我想问一下是否有方法可以做到这一点? 我现在使用的方法是写2 ModelSerializer来显示它 请指导我。谢谢!!

这是我的原始代码(不是2 ModelSerializer方法)

urls.py:

urlpatterns = patterns(
    '',
    url(r'^movies/$', MovieList.as_view(), name='movie-list'),
    url(r'^movies/(?P<pk>[0-9]+)/$', MovieDetail.as_view(), name='movie-detail'),       

这是我的views.py:

class MovieMixin(object):
    queryset = Movie.objects.all()
    serializer_class = MovieSerializer

class MovieFilter(django_filters.FilterSet):
    class Meta:
        model = Movie
        fields = ['which_run',]

class MovieList(MovieMixin, generics.ListAPIView):
    filter_class = MovieFilter

class MovieDetail(MovieMixin, generics.RetrieveAPIView):
    pass

这是我的serializes.py

class MovieSerializer(serializers.ModelSerializer):
      class Meta:
        model = Movie
        fields = ('id', 'title','Showtimes',)

1 个答案:

答案 0 :(得分:0)

您可以使用两个序列化程序,通过在序列化程序上的get_serializer_class方法中交换序列化程序来完成此操作。这适用于所有通用视图,包括ViewSet个实例。在您的情况下,您也可以使用自定义序列化程序覆盖详细视图上的serializer_class

class MovieMixin(object):
    queryset = Movie.objects.all()

class MovieList(MovieMixin, generics.ListAPIView):
    filter_class = MovieFilter
    serializer_class = MovieSerializer

class MovieDetail(MovieMixin, generics.RetrieveAPIView):
    serializer_class = MovieDetailSerializer

还有一些插件可以让你这样做,最值得注意的是included with drf-extensions

这些都需要一个新的序列化程序,它只处理细节视图表示。

class MovieSerializer(serializers.ModelSerializer):
      class Meta:
        model = Movie
        fields = ('id', 'title', )

class MovieDetailSerializer(MovieSerializer):
      class Meta(MovieSerializer.Meta:
        fields = MovieSerializer.Meta.fields + ('Showtimes', )

这将允许您为列表视图和详细信息视图提供两个不同的序列化响应。