2014-06-20 47 views
1

我已經Patient,Doctor,Story型號。每個Story有一個patient_id和一個doctor_id。我想檢索病人曾經去過的醫生名單。Tastypie序列化虛擬現場的模型

class Patient(Person): 

    def visits(self): 
     doctor_visits = [] 
     for v in self.stories.values('doctor').annotate(visits=Count('doctor')): 
      # replace the doctor id with doctor object 
      v['doctor'] = Doctor.objects.get(id=v['doctor']) 
      doctor_visits.append(v) 

     return doctor_visits 

這裏是我的tastypie資源

class PatientResource(ModelResource): 
    stories = fields.ToManyField('patients.api.StoryResource', 'stories', null=True) 
    visits = fields.ListField(attribute='visits', readonly=True) 

    class Meta: 
     queryset = Patient.objects.all() 
     excludes = ['id', 'login', 'password'] 

上述tastypie結果如下

{ 
    address:"ADDRESS", 
    dob:"1985-12-04", 
    email:"EMAIL", 
    name:"Nogen", 
    resource_uri:"/patients/api/v1/patient/9/", 
    sex:"M", 
    stories:[ 
    "/patients/api/v1/story/1/", 
    "/patients/api/v1/story/2/", 
    "/patients/api/v1/story/4/" 
    ], 
    visits:[ 
    { 
     doctor:"Dr. X", 
     visits:2 
    }, 
    { 
     doctor:"Dr. Y", 
     visits:1 
    } 
    ] 
} 

看到它caling的Doctor__unicode__方法,而我希望這是一個鏈接/patients/api/v1/doctor/<doctor_id>/我是否需要手動構建路徑或有其他方法?

我使用dehydrate嘗試可能不正確

class PatientResource(ModelResource): 
    stories = fields.ToManyField('patients.api.StoryResource', 'stories', null=True) 
    visits = fields.ListField(attribute='visits', readonly=True) 

    class Meta: 
     queryset = Patient.objects.all() 
     excludes = ['id', 'login', 'password'] 

    def dehydrate_visits(self, bundle): 
     for visit in bundle.data['visits']: 
      visit['doctor'] = DoctorResource(visit['doctor']) 

     return bundle 

最大遞歸深度業績超過了同時調用Python對象異常

回答

0

不知道爲什麼你得到最大遞歸深度,但你的方法錯誤。

class PatientResource(ModelResource): 
    [...] 

    def dehydrate_visits(self, bundle): 
     # Make sure `bundle.data['visits'][0]['doctor'] isn't string. 
     # If it's already dehydrated string: try use `bundle.obj.visits` instead. 
     for visit in bundle.data['visits']: 
      visit['doctor'] = DoctorResource.get_resource_uri(visit['doctor']) 

     return bundle 

我沒有測試過。所以如果它不正確,請免費評論。