Django REST API列表视图

Django REST API列表视图,django,rest,web,Django,Rest,Web,目前我正在尝试用Django/RESTAPI开发个人博客,但我遇到了麻烦 博客中有很多帖子,我想用超链接控制这些帖子。我是通过使用ModelViewSet实现的,然而,detailView中的全部数据也显示在ListView中 问题是,我只希望在ListView中显示帖子的url和标题,而DetailView包含完整的数据。 下面是我的代码和REST框架给出的当前结果。 不介意索引查看 # serializers class PostSerializer(serializers.Hyperlin

目前我正在尝试用Django/RESTAPI开发个人博客,但我遇到了麻烦

博客中有很多帖子,我想用超链接控制这些帖子。我是通过使用ModelViewSet实现的,然而,detailView中的全部数据也显示在ListView中

问题是,我只希望在ListView中显示帖子的url和标题,而DetailView包含完整的数据。 下面是我的代码和REST框架给出的当前结果。 不介意索引查看

# serializers
class PostSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Post
        fields = '__all__'

# views
class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = serializers.PostSerializer
    permission_classes = (IsAdminUser, )
REST API中的Post列表:

REST API中的Post实例:


据我所知,列表视图需要一个单独的序列化程序

您可以创建一个自定义序列化程序,该序列化程序接受字段arg以选择特定字段。但是,为ListView单独设置一个可能更简单。此外,对于列表视图,如果仅显示模型字段的子集,则可以使用queryset上的only函数仅返回所需的模型数据。例如:

qs=MyModel.objects.all.only'field\u a'、'field\u b'、'field\u c'

如果您决定这样做,以下是自定义序列化程序:

class CustomSerializer(serializers.ModelSerializer):
    def __init__(self, *args, **kwargs):
        selected_fields = kwargs.pop('selected_fields', None)

        # used pop function so selected_fields is not passed to superclass
        super().__init__(*args, **kwargs)
        if selected_fields:
            # make sure only fields for the model are allowed
            fields = set(selected_fields)
            current_fields = set(self.fields.keys())
            for field in current_fields - fields:
                self.fields.pop(field)

class MyModelSerializer(CustomSerializer):
    class Meta:
        model = MyModel
        fields = '__all__'
在列表视图中:

required_fields = ('field_a', 'field_b', 'field_c')
data_to_return = MyModelSerializer(model_queryset, many=True, fields=required_fields).data
return Response(data)

不要将代码作为图像发布