django-simple-history的tastypie - 将模型历史显示为rest API

时间:2014-01-07 18:50:15

标签: django model history tastypie

我想使用tastypie分享django模型历史记录(由django-simple-history创建)。 问题是,如何为此目的准备ModelResource

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 - 显示选择任务的详细信息
  3. http://127.0.0.1/api/v1/task/1/history - 显示任务编号的历史记录。 1
  4. 前两个链接显示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应该返回包含历史记录条目的包..但是这个方法应该怎么样? 我想,我需要创建包含所需数据的包,但不知道我该怎么做。 有人有简单历史和tastypie的经验来呈现一些简单的例子吗?

1 个答案:

答案 0 :(得分: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-history id字段中包含主要对象的id。修订主键名{ {1}})

希望,这将有助于某人。