2014-09-18 19 views
5

Supponiamo di voler dareserializzatore multiplo django-rest-framework per 1 modello?

{field1, field2, field3} su richiesta dettaglio.
{field1, field2} su richiesta elenco.
{field1} su qualche altra richiesta di elenco più semplice.

Ho visto esempi utilizzando get_serializer_class con self.action che può gestire lo scenario dettaglio vs lo scenario. (https://stackoverflow.com/a/22755648/433570)

Devo definire due viewet e due endpoint di URL?
O c'è un approccio migliore qui?

Immagino che questo possa essere applicato anche a tastypie. (due risorse?)

+0

Eventuali duplicati di [Django Riposo quadro: restituire dinamicamente sottoinsieme di campi] (http://stackoverflow.com/questions/23643204/django-rest-framework-dynamically-return-subset-of-fields) – Louis

risposta

2

Non l'ho provato da solo, ma penso che tu possa farlo ignorando i metodi di cui hai bisogno.

Secondo the documentation (marcatura azioni extra per il routing) si potrebbe fare:

class UserViewSet(viewsets.ViewSet): 
""" 
Example empty viewset demonstrating the standard 
actions that will be handled by a router class. 

If you're using format suffixes, make sure to also include 
the `format=None` keyword argument for each action. 
""" 

def list(self, request): 
    pass 

def create(self, request): 
    pass 

def retrieve(self, request, pk=None): 
    pass 

def update(self, request, pk=None): 
    pass 

def partial_update(self, request, pk=None): 
    pass 

def destroy(self, request, pk=None): 
    pass 

Oppure, se avete bisogno di metodi personalizzati:

from django.contrib.auth.models import User 
from rest_framework import status 
from rest_framework import viewsets 
from rest_framework.decorators import detail_route, list_route 
from rest_framework.response import Response 
from myapp.serializers import UserSerializer, PasswordSerializer 

class UserViewSet(viewsets.ModelViewSet): 
""" 
A viewset that provides the standard actions 
""" 
queryset = User.objects.all() 
serializer_class = UserSerializer 

@detail_route(methods=['post']) 
def set_password(self, request, pk=None): 
    user = self.get_object() 
    serializer = PasswordSerializer(data=request.DATA) 
    if serializer.is_valid(): 
     user.set_password(serializer.data['password']) 
     user.save() 
     return Response({'status': 'password set'}) 
    else: 
     return Response(serializer.errors, 
         status=status.HTTP_400_BAD_REQUEST) 

@list_route() 
def recent_users(self, request): 
    recent_users = User.objects.all().order('-last_login') 
    page = self.paginate_queryset(recent_users) 
    serializer = self.get_pagination_serializer(page) 
    return Response(serializer.data) 
+1

ok, con @list_route, è possibile aggiungere più end point di lista, con il codice http : //stackoverflow.com/questions/22616973/django-rest-framewo rk-use-different-serializers-in-the-same-modelviewset, posso ottenere l'effetto desiderato. – eugene

+0

Si prega di correggere indentazione, è Python !!!. – ofnowhere

Problemi correlati