2017-02-10 71 views
0

我有大型數據表(〜30 Mb),我將它轉換爲Django中的模型。現在我想通過REST API訪問這些數據。Django rest框架:爲模型的每個字段自動創建一個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的分頁可以讓你將結果分成頁面。您不必在同一頁面中顯示所有條目。我認爲這對你來說是最好的選擇。

參見上分頁Django文檔: Pagination in django

+0

他遇到的問題是不同的。他需要從他的所有樣本中挑選一個特定的領域,並一次性得到它們。 –

相關問題