在Django-Tastypie中使用extra_actions时如何摆脱“id”参数?

时间:2014-02-06 13:54:55

标签: django tastypie

我正在使用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

When <code>resouce_type</code> declared as <code>list</code>

我该怎么做?

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

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

enter image description here

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

enter image description here

1 个答案:

答案 0 :(得分:0)

实施extra_actionslist vs view类型的方式都在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,如mapping.py函数下build_extra_operation所示。参数是根据下面复制的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参数也在我的视图中显示。