2017-02-10 16 views
0

私はDjangoのモデルに変換した大きなデータテーブル(〜30 Mb)を持っています。今、私はそのデータにREST APIを通してアクセスしたいと思っています。Django rest framework:モデルの各フィールドに自動的にURLを作成します。

私は正常にDjango RESTフレームワークをインストールしましたが、モデルの各フィールドのURLを自動的に作成する方法を探しています。私のモデルには約100のフィールドがあり、各フィールドには約100,000のエントリがあります。

私のモデルは、サンプル、

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... 

命名されている場合、私はこのようなDjangoのRESTフレームワークを使用してモデル全体に​​アクセスすることができます。

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) 

しかし、もちろん、私のブラウザでは、すべてをロードすることはできませんそのデータを妥当な時間内に収集します。手動で別のクラスと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

ページネーションを使用してください。あなたはあなたの質問とほぼ同じ方法でそれを行うことができます。 djangoのページネーションでは、結果をページに分割できます。同じページにすべてのエントリを表示する必要はありません。私はこれがあなたにとって最良の選択だと思います。

は、ページネーションのジャンゴのドキュメントを参照してください: Pagination in django

+0

彼が持っている問題は異なっています。彼はすべてのサンプルから特定のフィールドを抜き取って一度にすべて取得する必要があります。 –

関連する問題