Перечень Django Rest Framework и подробный вид перекрываются - PullRequest
0 голосов
/ 29 апреля 2018

Мой API собирается перечислить кучу эпизодов подкаста. Сам список должен быть урезан и не иметь большого количества данных, чтобы быть достаточно маленьким, чтобы вытащить весь список сразу. Вот мой сериализатор DRF класса

class EpisodeSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Episode
        fields = ('url', 'id', 'title', 'subtitle', 'show_id', 'published_at', 'updated_at')

Это прекрасно работает, используя этот вид

class EpisodeViewSet(viewsets.ModelViewSet):
    queryset = Episode.objects.all().order_by('-published_at')
    serializer_class = EpisodeSerializer

HyperlinkedModelSerializer также связывает эпизоды с их подробными видами, но, очевидно, использует тот же вид по умолчанию. Теперь я хочу быть более детальным в подробном представлении, поэтому я сделал следующее:

router.register(r'episodes', views.EpisodeViewSet)
router.register(r'episode', views.EpisodeDetailViewSet)

добавил этот маршрут и сделал новый вид

class EpisodeDetailViewSet(viewsets.ModelViewSet):
    queryset = Episode.objects.all().order_by('-published_at')
    serializer_class = EpisodeDetailSerializer

и сериализатор, использующий дополнительные модели для более подробной информации

class EpisodeDetailSerializer(serializers.ModelSerializer):
    chapters = ChapterMarkSerializer(source='chaptermark_set', many=True)
    media = MediaClipSerializer(source='mediaclip_set', many=True)
    show = ShowSerializer()

    class Meta:
        model = Episode
        fields = ('url', 'id', 'title', 'subtitle', 'show', 'published_at', 'updated_at','description', 'show_notes', 'cover_image', 'updated_at', 'chapters', 'media')
        depth = 1

Теперь это в основном работает для каждого Эпизода, теперь использующего формат /episode/123, но также отображает все эпизоды с полными подробностями в URL-адресе /episode и перезаписывает URL-адрес / episodes, который больше не отображается на индексной странице API. .

Я полагаю, это из-за записи model = Episode, которая перезаписывает другой класс за то, что он отвечает за эту модель?

Я думаю, что мое новое представление каким-то образом должно быть ограничено, чтобы не перечислять все эпизоды, и тогда два представления / сериализатора должны как-то сосуществовать, но я чувствую, что застрял здесь, и документы действительно не помогают мне.

Спасибо за любой совет.

1 Ответ

0 голосов
/ 29 апреля 2018

Вместо дополнительного набора представлений (который может сделать ваш код более сложным для обслуживания), я предлагаю простое переопределение get_serializer_class из EpisodeViewSet. Используя атрибут self.action, вы можете проверить текущее действие и использовать другой сериализатор только для подробного ответа:

class EpisodeViewSet(viewsets.ModelViewSet):
    queryset = Episode.objects.all().order_by('-published_at')

    def get_serializer_class(self):
        if self.action == 'retrieve':
            return EpisodeDetailSerializer
        return EpisodeSerializer

Теперь вам не нужно EpisodeDetailViewSet, а в urls.py у вас будет только одна маршрутизация:

router.register(r'episodes', views.EpisodeViewSet)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...