我正在开发一个后台使用Tastypie和Django开发的Android应用程序。我有一个get请求,我希望能够选择性地检索整个对象(包含完整的相关字段,而不是uri)。下面是我正在谈论的资源的部分python代码:
class RideResource(ModelResource):
user = fields.ForeignKey(UserResource, 'driver')
origin = fields.ForeignKey(NodeResource, 'origin', full=True)
destination = fields.ForeignKey(NodeResource, 'destination', full=True)
path = fields.ForeignKey(PathResource, 'path')
# if the request has full_path=1 then we perform a deep query, returning the entire path object, not just the URI
def dehydrate(self, bundle):
if bundle.request.GET.get('full_path') == "1":
self.path.full = True
else:
ride_path = bundle.obj.path
try:
bundle.data['path'] = _Helpers.serialise_path(ride_path)
except ObjectDoesNotExist:
bundle.data['path'] = []
return bundle
可以看到,riderresource有一个指向PathResource的外键。我使用脱水函数来检查GET请求是否将参数"full_path"设置为1。在这种情况下,我通过编程将路径变量设置为full=True
。否则,我只返回路径URI。
问题是代码似乎只有在第二次执行GET时才能工作。我已经测试了数百次,当我使用full_path=1
执行GET时,即使它输入if并设置self.path.full = True
,第一次它也只返回PathResource对象的URI。然而,如果我重新启动完全相同的请求第二次它工作完美…
你知道是什么问题吗?
在找到解决方案后编辑感谢@Tomasz Jakub Rup
我终于设法让它工作使用以下代码:
def full_dehydrate(self, bundle, for_list=False):
self.path.full = bundle.request.GET.get('full_path') == "1"
return super(RideResource, self).full_dehydrate(bundle, for_list)
def dehydrate(self, bundle):
if not bundle.request.GET.get('full_path') == "1":
try:
bundle.data['path'] = _Helpers.serialise_path(bundle.obj.path)
except ObjectDoesNotExist:
bundle.data['path'] = []
return bundle
dehydrate
在full_dehydrate
之后调用。覆盖full_dehydrate
功能
def full_dehydrate(self, bundle, for_list=False):
self.path.full = bundle.request.GET.get('full_path') == "1"
return super(RideResource, self).full_dehydrate(bundle, for_list)