Можно ли использовать django viewset с двумя сериализаторами? - PullRequest
1 голос
/ 07 января 2020

У меня есть модель для Articles, в которой много полей. Когда кто-то получает указанную c статью id, я хочу отправить почти все поля обратно клиенту.

Однако, когда список статей сгенерирован, я не хочу отправлять все статьи со всеми этими данными, а ограничиваю каждую статью несколькими важными полями списка и для go длинных полей. как content et c ..

Могу ли я добиться этого с помощью элегантной настройки модуля django_restframework.viewsets, или я должен просто собрать методы api, используя вместо этого django_restframwork.generics?

пример:

# articles/api/urls.py #
# -------------------- #

from articles.api.views import ArticlesViewSet
from django.urls import path
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'', ArticlesViewSet, basename='articles')
urlpatterns = router.urls
# articles/api/views.py #
# --------------------- #
from rest_framework.viewsets import ModelViewSet

from ..models import Article
from .serializers import ArticleSerializerFull, ArticleSerializerShort


class ArticlesViewSet(ModelViewSet):
    # Perhaps some conditional code here?
    serializer_class = ArticleSerializerFull
    queryset = Article.objects.all()

Ответы [ 2 ]

1 голос
/ 07 января 2020

Вы можете использовать метод get_serializer_class() в DRF для решения проблемы ...

serializers.py

class ArticleFullSerializer(serializers.ModelSerializer):

    class Meta:
        model = Order
        fields = ('__all__')

class ArticleShortSerializer(serializers.ModelSerializer):

    class Meta:
        model = Order
        fields = ('field1', 'field2' ... 'fieldn')

views.py

from rest_framework.viewsets import ModelViewSet


class ArticleViewSet(ModelViewSet):
    serializer_class = ArticleSerializerFull
    queryset = Article.objects.all()

    def get_serializer_class(self):
        if self.action == 'list':
            serializer = ArticleShortSerializer
        else:
            serializer = ArticleFullSerializer
        return serializer
0 голосов
/ 07 января 2020

** Я верю, что вы можете достичь этого, используя общие представления check_here **

class ArticleFullSerializer(serializers.ModelSerializer):

    class Meta:
        model = Order
        fields = ('__all__')

class ArticleShortSerializer(serializers.ModelSerializer):

    class Meta:
        model = Order
        fields = ('field1', 'field2'..... 'fieldn')

и в ваших представлениях

class ArticleListView(ListAPIView):
    permission_classes = (permissions.IsAuthenticated,)
    queryset = Article.objects.all()
    serializer_class = ArticleShortSerializer

class ArticleDetailView(RetrieveAPIView):
   permission_classes = (permissions.IsAuthenticated,)
    queryset = Article.objects.all()
    serializer_class = ArticleFullSerializer
     lookup_field = 'pk'



  ****and in urls for details****

path('detail/<int:pk>/', ArticleDetailView.as_view(), name='article-detail'),
...