当用户转到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',)
答案 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', )
这将允许您为列表视图和详细信息视图提供两个不同的序列化响应。