2016-07-02 1 views
0

Tastypie 및 Django를 사용하여 개발 된 백엔드가있는 Android 애플리케이션을 개발 중입니다. 나는 선택적으로 전체 객체 (URI가 아닌 완전한 관련 필드 포함)를 검색 할 수 있도록 요청을받습니다. 아래는 제가 이야기 자원에 대한 파이썬 코드의 일부입니다Tastypie 전체 리소스 얻기 두 번째에만 작동

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 만 처음으로 반환합니다. 반면, 정확히 동일한 요청을 다시 시작하면 두 번째로 완벽하게 작동합니다 ...

어떤 문제인지 확인해보십시오.

편집 솔루션 FOUND 감사 후에 야쿱 RUP를

내가 마침내 다음 코드를 사용하여 작업 얻을 관리 @Tomasz TO :

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

dehydratefull_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)