2017-02-10 5 views
0

장고에서 모델로 변환 한 큰 데이터 테이블 (~ 30Mb)이 있습니다. 이제 REST API를 통해 해당 데이터에 액세스하려고합니다.Django rest framework : 모델의 각 필드에 대해 자동으로 URL을 생성합니다.

장고 REST 프레임 워크를 성공적으로 설치했지만 모델의 각 필드에 대한 URL을 자동으로 만드는 방법을 찾고 있습니다. 내 모델에는 약 100 개의 필드가 있으며 각 필드에는 약 100,000 개의 항목이 있습니다.

urls.py 
class SampleSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Sample 
     fields = (**100 fields**) 

class SampleViewSet(viewsets.ModelViewSet): 
    queryset = Sample.objects.all() 
    serializer_class = SampleSerializer 

router = routers.DefaultRouter() 
router.register(r'sample', SampleViewSet) 

그러나 물론 브라우저가 모두로드 할 수 없습니다 : 나는이 같은 장고 REST 프레임 워크를 사용하여 전체 모델에 액세스 할 수 있습니다 내 모델이 샘플라는 이름의 경우

,

models.py 

class Sample(models.Model): 
    index = models.IntegerField(primary_key=True) 
    year = models.IntegerField(blank=True, null=True) 
    name = models.TextField(blank=True, null=True) 
    ...97 more fields... 

그 데이터를 적절한 시간 내에 수동으로 각 필드마다 다른 클래스와 URL을 만들 수 있지만 더 좋은 방법이 있어야합니다 ... my_site.com/sample/year (예를 들어)로 이동하여 모든 연도를 나열 할 수 있기를 원합니다. JSON 형식 또는 my_site.com/sample/name 형식으로 모든 이름 등을 나열하십시오. 감사합니다. 감사합니다. 감사합니다.

답변

1

사용자 지정보기 집합 경로를 사용하여 설정할 수 있습니다.

당신이 있습니다

class ModelViewSet(ModelViewSet): 

    @list_route() 
    def sample_field(self, request): 
     desired_field = request.data.get('field', None) 
     if not desired_field: 
      return response # pseudocode 

     values = Model.objects.all().values_list(desired_field, flat=True) 
     # serialize this for returning the response 
     return Response(json.dumps(values)) # this is an example, you might want to do something mode involved 

당신은 URL에서이를 얻을 수있을 것입니다 :

/api/model/sample_field/?field=foo 

샘플 엔드 포인트 아래에 새 엔드 포인트를 작성합니다 뷰셋에 이러한 추가하는 방법. list_route이므로/sample_field를 사용하여 연결할 수 있습니다.

그래서 코드 다음, 그것은 다음과 같습니다 예를 들어

mysite.com/sample/sample_field/?field='year'

.

귀하의 질문에 많은 흥미로운 내용이 있지만이 샘플을 통해 나는 당신이 원하는 것을 얻을 수있을 것이라고 생각합니다.

+0

이 응답 해 주셔서 감사합니다. 귀하의 코드에 따라 URL 매핑이 어떻게 작동하는지 조금 혼란 스럽습니다. 이 코드를 변경해야합니까? router = routers.DefaultRouter() router.register (r'sample ', SampleViewSet)' –

+0

라우터 레지스트리를 변경할 필요가 없습니다. URL은 list_route 데코레이터로 장식 된 메소드 이름에서 파생됩니다. –

0

페이지 매김을 사용해보십시오. 당신은 당신이 질문하는 것과 거의 같은 방법으로 그것을 할 수 있습니다. 장고에서 페이지 매김을 사용하면 결과를 페이지로 나눌 수 있습니다. 같은 페이지에 모든 항목을 표시 할 필요는 없습니다. 나는 이것이 당신을위한 최선의 선택이라고 생각합니다.

는 페이지 매김에 장고 문서를 참조하십시오 : Pagination in django

+0

그가 가진 문제는 다릅니다. 그는 모든 샘플에서 특정 필드를 뽑아서 한꺼번에 가져와야합니다. –