Django REST API Listview - PullRequest
       15

Django REST API Listview

0 голосов
/ 04 января 2019

В настоящее время я пытаюсь разработать личный блог с помощью Django / REST API, и у меня есть для этого проблемы.

В блоге есть несколько постов, и я хочу контролировать эти посты с помощью Гиперссылки.Я сделал это с помощью ModelViewSet, однако, все данные в detailView также отображаются в ListView.

Дело в том, что я хочу, чтобы только "url" и "заголовок" сообщений отображались в ListView, тогда как DetailView содержит полные данные.Вот мой код и текущие результаты, предоставленные средой REST.Не возражайте против IndexView

# 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:

enter image description here

Опубликовать экземпляр в REST API:

enter image description here

1 Ответ

0 голосов
/ 04 января 2019

Насколько я знаю, вам нужен отдельный сериализатор для просмотра списка.

Вы можете создать собственный сериализатор, который принимает аргумент 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...