我正在使用tastypie,我想创建Resource
一个"单例"非模型对象.
出于这个问题的目的,让我们假设我想要的URL表示ini
文件中存在的一些系统设置.这意味着......:
我为此URL返回的字段将为此自定义创建Resource
- 没有包含此信息的模型.
我想要一个返回数据的URL,例如GET
请求/api/v1/settings
.
返回的数据应该以类似于细节URL的格式返回 - 也就是说,它不应该包含meta
和objects
部分.它应该只包含设置中的字段.
它不应该是GET
这样的对象的列表也不可能执行POST
,DELETE
或者PUT
(这部分我知道该怎么做,但我在这里添加它是为了完整性).
可选:它应该tastypie-swagger
适合API探索目的.
我得到了这个工作,但我认为我的方法有点屁股倒退,所以我想知道这里的常识是什么.到目前为止我尝试的是覆盖dehydrate
并完成那里的所有工作.这需要我覆盖obj_get
但是将其留空(这有点难看)并且还要id
通过覆盖去除细节URL 中的需要override_urls
.
有没有更好的方法呢?
您应该能够通过以下方式实现此目的.注意我实际上没有对此进行测试,因此可能需要进行一些调整.在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
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