aviya.developer
aviya.developer

Reputation: 3603

Is it possible to use a django viewset with two serializers?

I have a model for Articles which has a lot of fields. When someone fetches a specific article by id I want to send almost all of the fields back to the client.

However, when the articles list is generated I don't want to send all of the articles with all of that data, but rather limit each article to a few important listing fields, and forgo long fields like content etc..

Can I achieve these with an elegant tweak to the the django_restframework.viewsets module, or should I just build the api methods myself using django_restframwork.generics instead?

example:

# 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()

Upvotes: 1

Views: 155

Answers (2)

SEJ
SEJ

Reputation: 296

You can use get_serializer_class() method in DRF to solve the problem...

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

Upvotes: 1

Shavzz Hussain
Shavzz Hussain

Reputation: 89

**i believe you can achieve this by using generics views check_here **

class ArticleFullSerializer(serializers.ModelSerializer):

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

class ArticleShortSerializer(serializers.ModelSerializer):

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

and in your views

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'),

Upvotes: 0

Related Questions