2014-01-23 4 views
1

장고 휴식 프레임 워크를 사용하고 있는데 GenericRelation을 직렬화하려고합니다. 내 모델에서장고의 GenericRelation을 직렬화하는 방법

, 나는이 : 나는 이름과 자산 ID를 반환합니다 내 프로젝트에 대한 직렬화를 작성하려고 해요

class Asset(model.Models): 
    name = models.CharField(max_length=40) 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey('content_type','object_id') 

class Project(models.Model): 
    name = models.CharField(max_length=40) 
    file = generic.GenericRelation(Asset) 

. 나는이 있습니다

class AssetObjectRelatedField(serializers.RelatedField): 

    def to_native(self, value): 
     if isinstance(value, Project): 
      serializer = Project(value) 
     else: 
      raise Exception('Unexpected type of asset object') 

     return serializer.data 


class ProjectSerializer(serializers.HyperlinkedModelSerializer): 
    file = AssetObjectRelatedField() 
    class Meta: 
     model = Project 
     fields = ('name','file') 

내가 프로젝트에 액세스하려고 할 때 내가 얻을 : 자산 개체

내가 무엇을 누락 어떤 아이디어의

예기치 않은 유형?

업데이트 : 제대로 작동합니다. 그러나 내가 읽은 문서에 맞지 않는 것 같습니다. 대답은 자산 유형으로 AssetObjectRelatedField에 전달 된 값을 처리하는 것입니다. 이는 문서화 된 here과 다른 점입니다.

다음과 같이 작동합니다.

class AssetObjectRelatedField(serializers.RelatedField): 
    def to_native(self, value): 
     return value.id 
+0

당신이 데프 to_native에 .. – mariodev

+0

가 디버깅을 수행하십시오 전체 스택 트레이스를 넣을 수, 인쇄 유형 (값)은 자산 클래스임을 보여줍니다. 그것은 예상치 못한 것입니다 –

답변