2014-01-05 32 views
8

我正在使用tastypie,并且想为“单例”非模型对象创建Resource为“singleton”非模型对象创建tastypie资源

对于这个问题,我们假设我想让URL代表的是ini文件中存在的一些系统设置。 这意味着是...:

  1. 我回到这个URL字段将这个Resource可以自定义创建 - 没有包含此信息没有模型。
  2. 我想要一个将返回数据的URL,例如GET请求/api/v1/settings
  3. 返回的数据应以类似于详细信息URL的格式返回 - 即,它不应该有metaobjects部分。它应该只包含设置中的字段。
  4. 它不应该是可能的GET这样的对象的列表也不可能执行POST,DELETEPUT(这部分我知道该怎么做,但为了完整性我在此添加)。
  5. 可选:它应该与tastypie-swagger一起发挥良好的API勘探目的。

我得到了这个工作,但我认为我的方法是一种屁股倒退,所以我想知道这里的共同智慧是什么。我到目前为止所尝试的是重写dehydrate并完成所有工作。这要求我重写obj_get,但将其保留为空(这很丑陋),也可以通过覆盖override_urls来取消详细url中的id

有没有更好的方法来做到这一点?

+0

您可以显示迄今为止所做的工作吗? –

+0

为什么单身,为什么不是模特? –

+0

@RaydelMiranda我不明白你的问题;我提供了一个例子。 –

回答

1

这听起来像TastyPie的驾驶室之外的东西。为什么不用@require_GET来装饰一个视图,如果你想控制头部,并且返回一个HttpResponse对象,其所需的有效载荷为application/json

事实上,您的对象是一个单身人士,所有其他与RESTful的交互都被禁止,这表明REST库是这项工作的错误工具。

+0

您的建议存在的一个问题是,它不会在tastypie-swagger中显示资源,这对于API勘探非常重要。 –

+0

大多数情况下,我暗示这不是用API解决的问题,无论是否安静。 –

8

您应该可以通过以下方式实现此目的。注意我没有真正测试过,因此可能需要进行一些调整。更丰富的实例可以在Tastypie Docs

class SettingsResource(Resource): 
    value = fields.CharField(attribute='value', help_text='setting value') 

    class Meta: 
     resource_name = 'setting' 
     fields = ['value'] 
     allowed_methods = ['get'] 

    def detail_uri_kwargs(self, bundle_or_obj): 
     kwargs = {} 
     return kwargs 

    def get_object_list(self, request): 
     return [self.obj_get()] 

    def obj_get_list(self, request=None, **kwargs): 
     return [self.obj_get()] 

    def obj_get(self, request=None, key=None, **kwargs): 
     setting = SettingObject() 
     setting.value = 'whatever value' 
     return setting 

中发现的SettingObject必须支持GETATTRSETATTR方法。您可以将此作为模板使用:

class SettingObject(object): 
    def __init__(self, initial=None): 
     self.__dict__['_data'] = {} 
     if initial: 
      self.update(initial) 

    def __getattr__(self, name): 
     return self._data.get(name, None) 

    def __setattr__(self, name, value): 
     self.__dict__['_data'][name] = value 

    def update(self, other): 
     for k in other: 
      self.__setattr__(k, other[k]) 

    def to_dict(self): 
     return self._data 
相关问题