2014-09-18 29 views
5

ayrıntı talep üzerinedjango-rest-framework çoklu serializer?

{field1, field2, field3} vermek istediğinizi varsayalım. Liste isteği üzerine
{field1, field2}. Diğer bazı basit liste isteklerinde
{field1}.

Örnek listeme benzer ayrıntıları ele alan self.action ile get_serializer_class kullanarak örnekler gördüm. (https://stackoverflow.com/a/22755648/433570)

İki görüntüleme kümesini ve iki URL son noktasını tanımlamalı mıyım?
Veya burada daha iyi bir yaklaşım var mı?

Bu, tastipiye de uygulanabilir sanırım. (iki kaynak?)

+0

Olası yinelenen: Dinamik bir alt kümesini döndürür alanları] (http://stackoverflow.com/questions/23643204/django-rest-framework-dynamically-return-subset-of-fields) – Louis

cevap

2

Kendim test etmedim, ancak ihtiyacınız olan yöntemleri geçersiz kılabilirsiniz.

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 

Yoksa özel yöntemleri gerekirse:

the documentation (yönlendirme için ekstra eylemleri İşaretleme) 'a göre Yapabileceğin

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) 
[Django istirahat Framework
+1

Tamam, @list_route ile kod http ile birden fazla liste bitiş noktası ekleyebilirsiniz. : //stackoverflow.com/questions/22616973/django-rest-framewo rk-use-different-serializers-in-the-aynı-modelviewset, istenen etkiyi elde edebilirim. – eugene

+0

Lütfen girintiyi düzeltin, bu Python !!! – ofnowhere