Tastypie序列化虚拟场模型

时间:2014-06-20 11:44:08

标签: python django rest tastypie

PatientDoctorStory模特。每个Story都有patient_iddoctor_id。我想找回患者曾经去过的医生名单。

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
    }
  ]
}

请参阅__unicode__ Doctor /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 可能不正确

{{1}}

调用Python对象时超出最大递归深度的结果异常

1 个答案:

答案 0 :(得分: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

我没有测试过。如果不正确,请填写评论。