2014-09-18 13 views
5

Angenommen, Sie möchtendjango-rest-framework mehrere serializer für 1 modell?

{field1, field2, field3} auf Detailanforderung ausgeben.
{field1, field2} auf Listenanforderung.
{field1} auf einige andere einfachere Liste Anfrage.

Ich habe Beispiele gesehen mit get_serializer_class mit self.action, die Detail vs Liste Szenario behandeln kann. (https://stackoverflow.com/a/22755648/433570)

Sollte ich zwei Viewsets und zwei URL-Endpunkte definieren?
Oder gibt es hier einen besseren Ansatz?

Ich denke, das könnte auch auf tastypie angewendet werden. (zwei Ressourcen?)

+0

Mögliche Duplikat [Django Ruhe Framework: Dynamisch Rückkehr Teilmenge von Felder] (http://stackoverflow.com/questions/23643204/django-rest-framework-dynamically-return-subset-of-fields) – Louis

Antwort

2

Ich habe es nicht selbst getestet, aber ich denke, Sie können es die Methoden überschreiben, die Sie benötigen.

Nach the documentation (Kennzeichnung zusätzliche Aktionen für das Routing) Sie tun können:

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 

Oder wenn Sie benutzerdefinierte Methoden benötigen:

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, mit @list_route, können Sie mehrere Liste Endpunkte hinzufügen, mit dem Code http : //stackoverflow.com/questions/22616973/django-rest-framewo rk-used-different-serializer-im-selben-modelviewset, ich kann den gewünschten Effekt erzielen. – eugene

+0

Bitte korrigieren Sie den Einzug, es ist Python !!!. – ofnowhere

Verwandte Themen