为“单例”非模型对象创建tastypie资源

时间:2014-01-05 11:51:44

标签: python django rest tastypie

我正在使用tastypie,我想为“singleton”非模型对象创建Resource

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

  1. 我将为此Resource自定义为此网址返回的字段 - 没有包含此信息的模型。
  2. 我想要一个会返回数据的网址,例如GET上的/api/v1/settings请求。
  3. 返回的数据应以与详细信息URL类似的格式返回 - 即,它不应包含metaobjects部分。它应该只包含设置中的字段。
  4. 不应该GET此类对象的列表也不可能执行POSTDELETEPUT(此部分我知道如何操作) ,但我在这里添加这个是为了完整性。)
  5. 可选:它应与tastypie-swagger一起用于API探索目的。
  6. 我让这个工作,但我认为我的方法有点屁股倒退,所以我想知道这里的常识是什么。到目前为止我尝试的是覆盖dehydrate并在那里完成所有工作。这需要我覆盖obj_get但是将其留空(这有点难看),并且还要通过覆盖id来删除详细信息网址中override_urls的需要。

    有更好的方法吗?

2 个答案:

答案 0 :(得分: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必须支持 getattr setattr 方法。您可以将其用作模板:

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

答案 1 :(得分:1)

这听起来像是在TastyPie的驾驶室之外。如果您想控制标题,为什么不在一个用@require_GET装饰的地方设置单个视图,并返回一个HttpResponse对象,其所需的有效负载为application/json

您的对象是单例以及与其进行的所有其他RESTful交互是禁止的,这表明REST库是此作业的错误工具。