Tastypie获得完整资源仅在第二次工作

时间:2016-07-02 16:36:19

标签: python django tastypie

我正在开发一个使用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

正如您所看到的,RideResource有一个指向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

1 个答案:

答案 0 :(得分:1)

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)