2014-07-09 2 views
2

사용 중 http://www.django-rest-framework.org/django rest framework에서 modelViewSet에 하나 이상의 변수를 전달하는 방법은 무엇입니까?

데이터베이스에서 데이터를 가져와야하는 것을 기반으로 둘 이상의 변수를 전달하려는 시나리오가 있습니다. 다음 코드에서 pk만이 데이터베이스의 다른 두 필드로 대체하려고합니다.

또한 제 urlconfig를 어떻게 작성하는지 제안 해주십시오.

는 Views.py

class ExampleViewSet(viewsets.ReadOnlyModelViewSet): 
    model = myTable 
    def list(self, request): 
     queryset = myTable.objects.all() 
     serializer = mySerializer(queryset, many=True) 
     return Response(serializer.data) 
    def retrieve(self, request, pk=None): 
     queryset = myTable.objects.all() 
     s = get_object_or_404(queryset, pk=pk) 
     serializer = mySerializer(s) 
     return Response(serializer.data) 

Serializer.py

다음
class Serializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = myTable 
     fields = ('attr1', 'attr2', 'attr3') 
+0

어떻게 같은 시리얼 모양? 필드가없는 예제를 줄 수 있습니까? 외래 키를 의미합니까? –

+0

@DenisCornehl이 (가) serializer 예제를 사용하여 질문을 편집했습니다. – theLeanDeveloper

답변

4

당신은 당신이 원하는 것을 구현하는 방법의 예입니다 다음 urlconf에 관해서는

class ExampleViewSet(viewsets.ReadOnlyModelViewSet): 
# This code saves you from repeating yourself 
queryset = myTable.objects.all() 
serializer_class = mySerializer 

def list(self, request, *args, **kwargs): 
    # Get your variables from request 
    var1 = request.QUERY_DICT.get('var1_name', None) # for GET requests 
    var2 = request.DATA.get('var2_name', None) # for POST requests 
    if var1 is not None: 
     # Get your data according to the variable var1 
     data = self.get_queryset().filter(var1) 
     serialized_data = self.get_serializer(data, many=True) 
     return Response(serialized_data.data) 

    if var2 is not None: 
     # Do as you need for var2 
     return Response(...) 

    # Default behaviour : call parent 
    return super(ExampleViewSet, self).list(request, *args, **kwargs) 

def retrieve(self, request, *args, **kwargs): 
    # Same for retrieve 
    # 1. get your variable xyz from the request 
    # 2. Get your object based on your variable's value 
    s = myTable.objects.get(varX=xyz) 
    # 3. Serialize it and send it as a response 
    serialized_data = self.get_serializer(s) 
    return Response(serialized_data.data) 
    # 4. Don't forget to treat the case when your variable is None (call parent method) 

, 변수를 보내는 방법 (URL 가져 오기, 게시 또는 URL을 통해)에 대한 nds.

희망이 도움이됩니다.

+0

나는 당신의 대답을 시도했다.나는 AttributeError 예외를 얻고있다 : 'WSGIRequest'객체는 GET 요청과 관련된 'QUERY_DICT'속성이 없다. – theLeanDeveloper

+0

Oups, 나쁘다. QUERY_PARAMS입니다. [here] (http://www.django-rest-framework.org/api-guide/requests#query_params)를 참조하십시오. 나는이 정확한 코드를 테스트 해 본적이 없다. 그러나 이것이 내가 보통 그렇게하는 방법 인 것이다. – AdelaN

+0

감사합니다 AdelaN :) – theLeanDeveloper

4

다음은 최근 장고 REST 프레임 워크에서 수행하는 방법입니다.

가정 당신의 변수과 같이 자원의 URL에 : 그런 다음

GET /parent/:id/child/ 
GET /parent/:id/child/:id/ 

:

urls.py :

from rest_framework.routers import DefaultRouter 

router = DefaultRouter() 
router.register(r'parent/(?P<parent_id>.+)/child', views.ExampleViewSet) 
urlpatterns = router.urls 

views.py :

class ExampleViewSet(viewsets.ReadOnlyModelViewSet): 
    serializer_class = Serializer 

    def get_queryset(self): 
     parent = self.kwargs['parent'] 
     return myTable.objects.filter(parent=parent) 

어디에서 '부모'가 queryset 부분은 부모 개체입니다. 물론 약간 조정해야 할 수도 있지만 아이디어는 kwargs에 캡슐화되어 있습니다.

이 솔루션을 사용하면 약간의 코드를 절약 할 수 있으며 코드를 서브 클래 싱하여 ModelViewSet으로 만들 수 있습니다.

희망이 있습니다.

기타 여기 : DRF Filtering against the URL.

0

urls.py

url( 
     regex=r'^teach/(?P<pk>\d+?)/(?P<pk1>\d+?)/$', 
     view=teach_update.as_view(), 
     name='teach' 
    ) 

템플릿

<td><a href="/teach/{{tid}}/{{i.id}}"><button type="button" class="btn  
btn-warning">Update</button></a></td> 

Views.py

class teach_update(view): 
    def get(self,request,**kwargs): 
     dist=self.kwargs['pk'] 
     ddd=self.kwargs['pk1'] 
관련 문제