【问题标题】:Django REST API ListviewDjango REST API 列表视图
【发布时间】:2019-01-04 09:07:40
【问题描述】:

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

博客中有很多帖子,我想用超链接控制这些帖子。我是使用 ModelViewSet 制作的,但是 detailView 中的整个数据也显示在 ListView 中。

问题是,我只想在 ListView 中显示帖子的“url”和“title”,而 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 中的帖子列表:

在 REST API 中发布实例:

【问题讨论】:

  • 不要将代码发布为图片

标签: django rest web


【解决方案1】:

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

您可以创建一个自定义序列化程序,该序列化程序采用 fields 参数来选择特定字段。但是为ListView 单独设置一个可能更简单。此外,对于列表视图,如果您只显示模型字段的子集,则可以在查询集上使用 only() 函数来仅返回您需要的模型数据。例如:

qs = MyModel.objects.all().only('field_a', 'field_b', 'field_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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 2013-09-20
    相关资源
    最近更新 更多