2014-01-07 102 views
1

我想用tastypie分享django模型歷史(由django-simple-history創建)。 問題是,如何爲此準備ModelResource與django簡單歷史記錄tastypie - 顯示模型歷史作爲其餘API

訪問模型歷史是由model.history經理。因此獲得我們可以獲得的模型的所有變化model.history.all()

我想獲得什麼?例如。我有Django的模型Task和API端點:

  1. http://127.0.0.1/api/v1/task - 顯示所有任務列表
  2. http://127.0.0.1/api/v1/task/1 - 顯示細節choosen任務
  3. http://127.0.0.1/api/v1/task/1/history - 任務沒有顯示歷史。 1

前兩個鏈接提供了ModelResource的默認行爲。我到現在爲止有什麼?

class TaskResource(ModelResource): 

    class Meta: 
     # it displays all available history entries for all task objects 
     queryset = Task.history.all() 
     resource_name = 'task' 

    def prepend_urls(self): 
     return [ 
      url(r"^(?P<resource_name>%s)/(?P<pk>\w[\w/-]*)/history$" % (self._meta.resource_name,), 
       self.wrap_view('get_history'), 
       name="api_history"), 
      ] 

    def get_history(self, request, **kwargs): 
     #... 

get_history應該返回束與歷史條目..但這種方法應該是什麼樣子? 我想我需要創建包含所需數據的包,但不知道應該如何做。 有人有簡單的歷史和品味經驗來介紹一些簡單的例子嗎?

回答

0

看來,解決方案比我想象的要簡單。也許有人在功能使用:

class TaskHistoryResource(ModelResource): 
    class Meta: 
    queryset = Task.history.all() 
    filtering = { 'id' = ALL } 

class TaskResource(ModelResource): 
    history = fields.ToManyField(AssetTypeHistoryResource, 'history') 

    class Meta: 
    # it displays all available history entries for all task objects 
    queryset = Task.history.all() 
    resource_name = 'task' 

    def prepend_urls(self): 
    return [ 
     url(r"^(?P<resource_name>%s)/(?P<pk>\w[\w/-]*)/history$" %(self._meta.resource_name,), 
      self.wrap_view('get_history'), 
      name="api_history"), 
     ] 

    def get_history(self, request, **kwargs): 
     try: 
     bundle = self.build_bundle(data={'pk': kwargs['pk']}, request=request) 
     obj = self.cached_obj_get(bundle=bundle, **self.remove_api_resource_names(kwargs)) 
     except ObjectDoesNotExist: 
     return HttpGone() 
     except MultipleObjectsReturned: 
     return HttpMultipleChoices("More than one resource is found at this URI.") 

     history_resource = TaskHistoryResource() 
     return history_resource.get_list(request, id=obj.pk) 

有點變化的解決方案來自: http://django-tastypie.readthedocs.org/en/latest/cookbook.html#nested-resources

基本上,有必要建立與歷史項的其他資源。 get_history方法創建並用適當的過濾器上id場返回它的實例(在django-simple-historyid領域包含的主要對象。修訂主鍵名history_idid

希望,這將幫助別人。