Tastypie 获得全部资源只能在第二次工作
Tastypie get full resource only works the second time
我正在开发一个 Android 应用程序,其后端是使用 Tastypie 和 Django 开发的。我有一个获取请求,我希望能够选择性地为其检索整个对象(具有完整的相关字段,而不是 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
如您所见,RideResource 有一个指向 PathResource 的外键。我正在使用 dehydrate 函数来检查 GET 请求是否将参数 "full_path" 设置为 1。在这种情况下,我以编程方式将路径变量设置为 full=True
。否则我只是 return 路径 URI。
问题是代码似乎只在第二次执行 GET 时才有效。我已经测试了数百次,当我使用 full_path=1
执行 GET 时,即使它进入 if 并设置 self.path.full = True
,第一次它也只是 return 的 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)
我正在开发一个 Android 应用程序,其后端是使用 Tastypie 和 Django 开发的。我有一个获取请求,我希望能够选择性地为其检索整个对象(具有完整的相关字段,而不是 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
如您所见,RideResource 有一个指向 PathResource 的外键。我正在使用 dehydrate 函数来检查 GET 请求是否将参数 "full_path" 设置为 1。在这种情况下,我以编程方式将路径变量设置为 full=True
。否则我只是 return 路径 URI。
问题是代码似乎只在第二次执行 GET 时才有效。我已经测试了数百次,当我使用 full_path=1
执行 GET 时,即使它进入 if 并设置 self.path.full = True
,第一次它也只是 return 的 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)