【问题标题】:How can I get rid of "id" parameter when using extra_actions in Django-Tastypie?在 Django-Tastypie 中使用 extra_actions 时如何摆脱“id”参数?
【发布时间】:2014-02-06 13:54:54
【问题描述】:

我正在使用 Django-Tastypie 构建 RESTful API。我正在使用extra actions 进行更多操作。当我将http_method 作为GET 传递时,我得到一个id 字段,在某些情况下我需要它,但在某些情况下我不需要它,因为我想在某些特定过滤结果中获得所有结果在一些。

所以,当我需要所有结果时,id 参数不应该在那里。当我需要过滤结果时,它应该在那里(它已经在那里)。所以,我的问题是当我需要所有结果时,如何删除 id 字段?

上面写着

如果resource_type 被声明为“list”,那么端点将不会在uri 或参数列表中包含{id} 参数。这适用于诸如上述示例的端点,这些端点过滤或执行跨多个项目的操作。如果省略了 resource_type 且 http_method 为“GET”,则端点将默认为“view”,并在 uri 和参数列表中包含 {id} 参数。

但这只是在URI的情况下,它仍然需要一个id字段,即使我将resouce_type声明为list

以下是屏幕截图:-

resouce_type 声明为list。看看 URI 中没有 {id}。但我希望在字段中不应该有 id

我该怎么做?

另外,我正面临另一个问题。我有一个通过ManyToManyField 关系与另一个字段相关的字段,这意味着我需要为该字段提供一个值列表。但它不需要一个 LIST,而是它本身需要一个字符串值。我已经为此本身上传了屏幕截图。请让我知道这个黑客。谢谢。

在这种情况下,installation_id 通过ManyToManyField 关联。它显示related,但我希望它应该接受一个值列表(installation_id)。我该怎么做?

为什么 delete 没有 id?我的意思是它显示id,但没有输入任何内容的字段。

【问题讨论】:

  • 我现在没有空闲时间,但我认为这是我的代码,所以我会在这个问题上加注星标,并在几个小时后回来。
  • 你能发布extra_actions dict吗?
  • 看起来你发现了一个错误!请参阅下面的答案,了解如何克隆存储库并进行更改。我将在这个 repo 上打开一个问题。
  • Issue #49 为此打开。

标签: django tastypie


【解决方案1】:

extra_actionslistview 类型的实现方式都在 mapping.py 内部。

这里有两个示例 extra_actions 端点,一个描述搜索视图 (list),另一个是用于投标的 POST 端点,需要 pk 参数。

extra_actions = [
    {
        "name": "search",
        "http_method": "GET",
        "resource_type": "list",
        "summary": "Search item listings",
        "response_class": "ListView",
        "fields": {
            "query": {
                "description": "Search terms"
            }
        },
    },
    {
        "name": "bid",
        "http_method": "POST",
        "resource_type": "view",
        "summary": "Bid on an item listing",
        "fields": {
            "name": {
                "description": "Bid on an item"
            },
            "email": {
                "description": "Bidder's email address"
            },
            "comments": {
                "description": "Notes or comments about the bid"
            },
            "bid": {
                "description": "Amount in USD or BTC"
            }
        }
    }
]

出于兼容性原因,extra_actions 默认为 view,如 build_extra_operation 函数下的 mapping.py 所示。参数是从下面复制的build_parameters_from_extra_action 构建的:

def build_parameters_from_extra_action(self, method, fields, resource_type):
    parameters = []
    if method.upper() == 'GET' or resource_type == "view":
        parameters.append(self.build_parameter(paramType='path',
            name=self._detail_uri_name(),
            dataType='int',
            description='ID of resource'))
    for name, field in fields.items():
        parameters.append(self.build_parameter(
            paramType="query",
            name=name,
            dataType=field.get("type", "string"),
            required=field.get("required", True),
            description=force_unicode(field.get("description", "")),
        ))

    return parameters

认为我正在经历这个问题。检查是if method.upper() == 'GET' or resource_type == "view": 而不是if method.upper() == 'GET' and resource_type == "view": 或更短且可能更正确的if resource_type == "view":

我建议克隆一个 repo 的副本并在本地进行此修改。我会检查一下检查修改会破坏什么。我注意到id 参数也在我的视图中按要求显示。

【讨论】:

  • 我会试试看能做些什么。同时,如果您(或我)发现了破解方法,请在此处或其他任何地方发布。谢谢
  • 另外,我还面临另一个问题。我有一个通过ManyToManyField 关系与另一个字段相关的字段,这意味着我需要为该字段提供一个值列表。但它不需要一个 LIST,而是它本身需要一个字符串值。我已经为此本身上传了屏幕截图。请让我知道这个黑客。谢谢。
猜你喜欢
  • 2014-09-22
  • 2011-01-23
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 2016-01-12
相关资源
最近更新 更多