2014-09-18 11 views
5

Załóżmy, że chcesz wydaćwielokrotny serializator django-rest-framework dla 1 modelu?

{field1, field2, field3} na żądanie szczegółowe.
{field1, field2} na żądanie listy.
{field1} na inne proste żądanie listy.

Widziałem przykłady przy użyciu get_serializer_class z self.action, które mogą obsługiwać scenariusz detail vs list. (https://stackoverflow.com/a/22755648/433570)

Czy należy zdefiniować dwa widoki i dwa punkty końcowe URL?
A może jest tu lepsze podejście?

Przypuszczam, że można to również zastosować do tastypie. (dwa zasoby?)

+0

Możliwy duplikat [Django Rest Framework: Dynamicznie powrócić podzbiór pola] (http://stackoverflow.com/questions/23643204/django-rest-framework-dynamically-return-subset-of-fields) – Louis

Odpowiedz

2

Nie testowałem tego samodzielnie, ale myślę, że możesz to zrobić, przesuwając metody, których potrzebujesz.

Według the documentation (oznakowanie dodatkowe działania na routing) można zrobić:

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 

Lub jeśli potrzebujesz metody niestandardowe:

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, z @list_route, możesz dodać wiele punktów końcowych listy, z kodem http : //stackoverflow.com/questions/22616973/django-rest-framewo rk-use-different-serializers-in-the-same-modelviewset, mogę osiągnąć pożądany efekt. – eugene

+0

Proszę poprawić wcięcie, to Python !!!. – ofnowhere

Powiązane problemy