私は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は、公開されていないジャンゴアプリケーションをサポートする私的使用のためのものであることにも注意してください。
あたりとしてあなたMyModelListクラスとにかく私の例を見ていいだろうか? – moku
いいえ、これは "url(r '^/stars/$'、MyModelList.as_view())で説明したクラスの例です。 MyModelListクラスのStarsModelList機能を自由に使用してください。 – sr3z
"url(r '^/stars/$'、StarsModelList.as_view())" – moku