【问题标题】:Tastypie serializing Virtual Field's ModelTastypie 序列化虚拟场的模型
【发布时间】:2014-08-11 03:58:32
【问题描述】:

我有PatientDoctorStory 模特。每个Story 都有一个patient_id 和一个doctor_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

这是我的美味派资源

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

上面的tastepie结果如下

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

查看它对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 对象时超出最大递归深度异常

【问题讨论】:

    标签: python django rest tastypie


    【解决方案1】:

    不知道为什么你会得到最大的递归深度,但你的方法是错误的。

    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
    

    我没有测试过。如有不妥请随意填写。

    【讨论】:

      猜你喜欢
      • 2013-04-13
      • 1970-01-01
      • 2015-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多