我有一个Tastypie API,我想得到" id"在POST请求中创建的资源,所以我找到的唯一解决方案是" always_return_data"它返回整个对象。
from tastypie.resources import ModelResource
from tastypie.authorization import Authorization
from tastypie.authentication import SessionAuthentication
from myproject.core.models import MyModel
class MyResource(ModelResource):
...
class Meta:
queryset = MyModel.objects.all()
resource_name = 'mymodel'
allowed_methods = ['get', 'put', 'post']
authentication = SessionAuthentication()
authorization = Authorization()
always_return_data = True # Added later
这很好用。但是在开始时我曾经写过测试并且有:
对于POST:self.assertHttpCreated(self.api_client.post('self.detail_url', format='json', data=data))
对于PUT:self.assertHttpAccepted(self.api_client.put(self.detail_url, format='json', data=new_data))
现在我设置always_return_data = True
旧测试失败后,coz POST返回200而不是201而PUT重新调整200而不是[202/204]
除了将assertHttpCreated
和assertHttpAccepted
替换为assertHttpOK
之外,是否有其他解决方案?如果可能,是否可以返回" id" POST请求中新创建的资源,但未设置always_return_data = True
。任何建议都是受欢迎的。谢谢。
答案 0 :(得分:1)
根据规范(http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.6),状态代码200
似乎是合适的。
对于良好做法,请始终使用list_allowed_methods
和detail_allowed_methods
而不是allowed_methods
。
更改allowed_methods = ['get', 'put', 'post']
,然后添加
list_allowed_methods = ['get', 'post']
detail_allowed_methods = ['get', 'put']
如果创建了新资源,请返回HttpCreated
(201 Created)。如果Meta.always_return_data = True
,将会有一个已填充的序列化数据。
如果现有资源已修改且Meta.always_return_data = False
(默认),则返回HttpNoContent
(204无内容)。如果现有资源已修改且Meta.always_return_data = True
,请返回HttpAccepted
(200 OK)。
对于测试用例,与assertHttpOK
一起,您可以添加另一个测试用例来验证响应数据对象并请求在发送/发布时发送的数据对象。