【问题标题】:Creating a tastypie resource for a "singleton" non-model object为“单例”非模型对象创建一个美味的资源
【发布时间】:2014-01-05 11:51:43
【问题描述】:

我正在使用tastepie,我想为“单例”非模型对象创建一个Resource

就这个问题而言,让我们假设我希望 URL 表示的是 ini 文件中存在的一些系统设置。 这意味着...:

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

我得到了这个工作,但我认为我的方法有点倒退,所以我想知道这里的普遍智慧是什么。到目前为止,我尝试的是覆盖 dehydrate 并在那里完成所有工作。这需要我覆盖 obj_get 但将其留空(这有点难看),并且还需要通过覆盖 override_urls 来消除详细信息 url 中对 id 的需要。

有更好的方法吗?

【问题讨论】:

  • 你能展示你到目前为止所做的事情吗?
  • 为什么是单例,为什么是非模型?
  • @RaydelMiranda 我不明白你的问题;我提供了一个例子。

标签: python django rest tastypie


【解决方案1】:

您应该能够通过以下方式实现此目的。注意我还没有实际测试过这个,所以可能需要一些调整。更丰富的例子可以在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

【讨论】:

    【解决方案2】:

    这听起来完全不在 TastyPie 的控制范围之内。如果您想控制标头并返回带有所需有效负载的HttpResponse 对象作为application/json,为什么不在某处装饰有@require_GET 的单个视图?

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

    【讨论】:

    • 您的建议的一个问题是它不会以tastepie-swagger 显示资源,这对于API 探索至关重要。
    • 我主要是建议这不是用 API 解决的问题,不管是否安静。
    猜你喜欢
    • 2012-09-25
    • 2012-04-03
    • 2013-04-26
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 2012-05-08
    相关资源
    最近更新 更多