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

And*_*mas 8 python django rest tastypie

我正在使用tastypie,我想创建Resource一个"单例"非模型对象.

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

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

我得到了这个工作,但我认为我的方法有点屁股倒退,所以我想知道这里的常识是什么.到目前为止我尝试的是覆盖dehydrate并完成那里的所有工作.这需要我覆盖obj_get但是将其留空(这有点难看)并且还要id通过覆盖去除细节URL 中的需要override_urls.

有没有更好的方法呢?

mir*_*ixx 8

您应该能够通过以下方式实现此目的.注意我实际上没有对此进行测试,因此可能需要进行一些调整.在Tastypie文档中可以找到更丰富的示例

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)


Cra*_*enz 1

这听起来完全超出了 TastyPie 的掌控范围。@require_GET如果您想控制标头,并返回一个HttpResponse具有所需负载的对象,为什么不在某个地方用 装饰单个视图呢application/json

事实上,您的对象是单例,并且禁止与其进行所有其他 RESTful 交互,这表明 REST 库不适合这项工作。