2016-09-07 9 views
0

私はdjango RESTで柔軟なAPIを設計しようとしています。私がこれを意味するのは、基本的にはクエリ文字列でフィルタリング可能なフィールドを持つことです。さらに、実行する複雑なメソッドを示すクエリ文字列内にパラメータがあることに加えて、 [OK]を、ここで詳細は以下のとおりです。クエリ文字列内の単一のパラメータとしての複雑な集計メソッド

views.py

class StarsModelList(generics.ListAPIView): 
    queryset = StarsModel.objects.all() 
    serializer_class = StarsModelSerializer 
    filter_class = StarsModelFilter 

serializers.py

class StarsModelSerializer(DynamicFieldsMixin, serializers.ModelSerializer): 
    class Meta: 
     model = StarsModel 
     fields = '__all__' 

mixins.py

class DynamicFieldsMixin(object): 
    def __init__(self, *args, **kwargs): 
     super(DynamicFieldsMixin, self).__init__(*args, **kwargs) 
     fields = self.context['request'].query_params.get('fields') 
     if fields: 
      fields = fields.split(',') 
      # Drop any fields that are not specified in the `fields` argument. 
      allowed = set(fields) 
      existing = set(self.fields.keys()) 
      for field_name in existing - allowed: 
       self.fields.pop(field_name) 

filters.py

class CSVFilter(django_filters.Filter): 
    def filter(self, qs, value): 
     return super(CSVFilter, self).filter(qs, django_filters.fields.Lookup(value.split(u","), "in")) 


class StarsModelFilter(django_filters.FilterSet): 
    id = CSVFilter(name='id') 

    class Meta: 
     model = StarsModel 
     fields = ['id',] 

urls.py

url(r’^/stars/$’, StarsModelList.as_view()) 

これは私にそうようなクエリ文字列を構築する能力を与える:

/api/stars/?id=1,2,3&fields=type,age,magnetic_field,mass 

これは素晴らしいです、私はこの機能が好きこのデータに適用する必要があるカスタム集約/変換メソッドも多数あります。私は何をしたいのは、そのようAGG = PARAMを持っている:

/api/stars/?id=1,2,3&fields=type,age,magnetic_field,mass,&agg=complex_method 

か、単に:

complex_methodを定義することは仕事のための正しいフィールドをつかむ
/api/stars/?agg=complex_method 

複雑な方法をどこからどこに追加すればよいかわかりませんので、いくつかのガイダンスに感謝します。また、apiは、公開されていないジャンゴアプリケーションをサポートする私的使用のためのものであることにも注意してください。

答えて

1

は間違いなく、これは私の現在のStarsModelListクラスを置き換えることを目的としてhttps://docs.djangoproject.com/en/1.10/ref/class-based-views/base/

from django.http import HttpResponse 
from django.views import View 

class StarsModelList(generics.ListAPIView): 
    queryset = StarsModel.objects.all() 
    serializer_class = StarsModelSerializer 
    filter_class = StarsModelFilter 

    def complex_method(request): 
     # do smth to input parameters if any 
     return HttpResponse('Hello, World!') 

    def get(self, request, *args, **kwargs): 
     if request.GET.get('agg', None) == 'complex_method': 
      return self.complex_method(request) 
     return HttpResponse('Hi, World!') 
+0

あたりとしてあなたMyModelListクラスとにかく私の例を見ていいだろうか? – moku

+0

いいえ、これは "url(r '^/stars/$'、MyModelList.as_view())で説明したクラスの例です。 MyModelListクラスのStarsModelList機能を自由に使用してください。 – sr3z

+0

"url(r '^/stars/$'、StarsModelList.as_view())" – moku

関連する問題