我正在使用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。但它不需要LIST,而是需要一个字符串值本身。我上传了屏幕截图。请让我知道这个黑客。感谢。
在这种情况下,installation_id
通过ManyToManyField
相关联。它显示related
,但我希望它接受一个值列表(installation_id
)。我怎么能这样做?
为什么删除没有ID?我的意思是它显示id
但没有输入任何内容的字段。
答案 0 :(得分:0)
实施extra_actions
和list
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
参数也在我的视图中显示。