我正在使用tastypie,我想为“singleton”非模型对象创建Resource
。
出于这个问题的目的,让我们假设我想要的URL代表的是ini
文件中存在的一些系统设置。
这意味着......:
Resource
自定义为此网址返回的字段 - 没有包含此信息的模型。GET
上的/api/v1/settings
请求。meta
和objects
部分。它应该只包含设置中的字段。GET
此类对象的列表也不可能执行POST
,DELETE
或PUT
(此部分我知道如何操作) ,但我在这里添加这个是为了完整性。)tastypie-swagger
一起用于API探索目的。我让这个工作,但我认为我的方法有点屁股倒退,所以我想知道这里的常识是什么。到目前为止我尝试的是覆盖dehydrate
并在那里完成所有工作。这需要我覆盖obj_get
但是将其留空(这有点难看),并且还要通过覆盖id
来删除详细信息网址中override_urls
的需要。
有更好的方法吗?
答案 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库是此作业的错误工具。