2016-11-15 4 views
0

まず、私はDjangoの世界では非常に新しく、同様の質問があるかもしれませんが、満足のいく回答は見つかりませんでした。Django:jsonレスポンスからいくつかのフィールドを除外します

ここに私のシナリオですが、私は私のDjangoアプリケーションからヒットし、100鍵のJSON応答を得る外部RESTエンドポイントはほとんどありません。さて、私はDjangoアプリケーションでAPIを書いていますが、このレスポンスはトリムして外の世界に送信する必要があります。今すぐID 1472とユーザープロファイルを与える

GET /api/profiles/1472 

は、このAPIは、これにより、次にいくつかの他のRESTエンドポイントを呼び出すと、実際のプロファイルのデータをフェッチします、例えば、 私のAPIがあると言います。ですから、私はプロキシエンドポイントを作成しています。このプロキシエンドポイントは、いくつかのフィールドをトリミングして呼び出し元に戻すことになっています。

私はこのためのモデルクラスを書いていません。

これをDjangoで実現するにはどうすればよいですか?

編集1: サンプルビューは次のようになり、

class GetCompetitorProductsView(APIView): 
    """ 
    Get Competitor products view 
    """ 

    def post(self, request, format=None): 
     # I'll be having a list of fields to be trimmed from response. 
     # It will be separate for every API. 
     data = request.data 

     error_checks = system_errors.check_for_competitor_products_input_error(data) 

     if not error_checks: 
      response = call_to_rest(data) 
      return Response(response) 
     else : 
      return Response(error_checks, status = status.HTTP_412_PRECONDITION_FAILED) 

そしてもう一つは、同じ動作は、他のすべてのAPIに適用されます。ですから、私は他のAPIにも簡単に適用できる汎用的なソリューションが必要です。

+1

これにはモデルは必要ありません。私たちにあなたの意見を表示 –

+0

@SardorbekImomalievがサンプルビューを追加しました。私が言及したように、私は他のAPIにも簡単に適用できる汎用ソリューションが必要です。各API用にトリムするフィールドのリストを用意します。 –

答えて

0

は、基本的にこれは

allowed_fields = ("first_name", "last_name", "email") 
user_info = call_rest_endpoint(id=1472) 
result = {key:value for key,value in user_info.items() if key in allowed_fields} 

最初の行は、uは返すようにしたいフィールドかを定義pythonでフィルタリングする方法です。

2行目はエンドポイントを呼び出し、theirdパーティAPIからデータを取得します。

3行目は3つのステートメントで構成されています。

  1. user_info.items()辞書を配列キー/値parisに変換します。
  2. これらのタプル
  3. からビルド辞書が、キーはあなたがあなたのビューの両親に入れた後、それをトリミングする方法を使用することを関数やミックスインを作成することができますallowed_fieldsタプル
+0

ありがとう@Ramast。私は各APIに対して同じコードを何度も書きたくはありません。 –

0

で見つかった場合にのみ。ここに例文があります

class TrimDataMixin(object): 
    ALLOWED_FIELDS = None 

    def trim_data(self, data): 
     allowed_fields = self.ALLOWED_FIELDS or [] 
     return {k: v for k, v in data.items() if k in allowed_fields} 


class GetCompetitorProductsView(TrimDataMixin, APIView): 
    """ 
    Get Competitor products view 
    """ 
    ALLOWED_FIELDS = ['first_name', 'last_name'] 

    def post(self, request, format=None): 
     # I'll be having a list of fields to be trimmed from response. 
     # It will be separate for every API. 
     data = request.data 

     error_checks = system_errors.check_for_competitor_products_input_error(data) 

     if not error_checks: 
      response = call_to_rest(data) 
      # trim data    
      response = self.trim_data(response) 
      return Response(response) 
     else: 
      return Response(error_checks, status = status.HTTP_412_PRECONDITION_FAILED) 
+0

ありがとう! Djangoにはフィルタ/シリアライザの方法がありますか?おそらくよりクリーンな方法? –

+0

@AashishPシリアライザでこれを行うことができます。しかし、似たようなことを手作業で書く必要があります。これを行うにはいくつかの方法がありますが、どのようにあなたの意見を書いているかによって決まります。たとえば、すべてのビューに同じ 'post'メソッドがある場合です。このメソッドを 'TrimDataMixin'に移動し、' ALLOWED_FIELDS'で行ったように、この 'post'をクラス変数でカスタマイズすることができます。 –

+0

あなたの意見を理解しました。コメントしてくれてありがとう。 –

関連する問題