2014-08-29 2 views
3

나는 django의 휴식 프레임 워크를 사용하여 사용자에 대한 정보를 표시하고 있습니다. 모든 사용자는 UserProfile에 저장된 연락처가 있습니다 (사용자 프로필은 일대일 관계를 사용하여 사용합니다). 연락처는 사용자 모델 (user.contacts)에서 직접 액세스 할 수 있습니다.
사용자의 모든 연락처에 대한 이름 (및 URL)을 표시하려고합니다. 나는 다음과 같은 시리얼을 썼다 :Django Rest Framework - 중첩 된 사용자의 사용자 프로필

{ 
    "url": "http:\/\/localhost:8080\/users\/1\/", 
    "username": "test1", 
    "email": "", 
    "contacts": [ 
    { 
     "user": 2 
    }, 
    { 
     "user": 1 
    } 
    ] 
} 

를 반환하지만이 원하는

class ContactsUserSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = get_user_model() 
     fields = ("username", "email") 


class ContactsSerializer(serializers.ModelSerializer): 
    # user = ContactsUserSerializer(many=True) # raises TypeError: 'User' object is not iterable 
    class Meta: 
     model = UserProfile 
     fields = ("user",) 


class UserSerializer(serializers.HyperlinkedModelSerializer): 
    contacts = ContactsSerializer(many=True) 

    class Meta: 
     model = get_user_model() 
     fields = ("url", "username", "email", "contacts") 

:

{ 
    "url": "http:\/\/localhost:8080\/users\/1\/", 
    "username": "test1", 
    "email": "", 
    "contacts": [ 
    { 
     "url": "http://link_to_user", 
     "username": "foo" 
    }, 
    { 
     "url": "http://link_to_user", 
     "username": "bar" 
    } 
    ] 
} 

가 어떻게 그것을 달성 할 수 있는가? 연락처 사용자에 대한 다른 serializer를 이미 추가하려고 시도했지만 유형 오류가 발생했습니다. 'User'객체가 반복 가능하지 않으며 JSON 구조가 약간 어색 해 보일 것입니다. {contacts : [user : { "username": ... },]}, 장고 사용자 프로필에 자신이 없다면 API 사용자를 혼동시킬 수 있습니다.

답변

6

필드가 자동으로 추가 되려면 이어야합니다. 다른 모델을 가리 키기 위해 url 필드가 필요하기 때문에 실제로는 HyperlinkedRelatedField을 사용하여이를 직렬화 기의 사용자 정의 필드로 추가해야합니다.

class ContactsSerializer(serializers.ModelSerializer): 
    url = serializers.HyperlinkedRelatedField(view_name="user-detail", source="user") 
    username = serializers.CharField(source="user.username") 

    class Meta: 
     model = UserProfile 
     fields = ("url", "username",) 

당신은 표시되는 것보다 모델에 다른 필드를 사용하려면 필드에 source 매개 변수를 사용할 수 있습니다. 이 경우 프로필에 user 관계의 입력란을 사용하고 있습니다.

user-detail은 라우터를 사용 중이거나 자습서를 따르는 경우 기본보기 이름이됩니다. 상세보기 이름과 일치하도록이 값을 조정해야 할 수도 있습니다.

+0

완벽하게 작동하지만'HyperlinkedModelSerializer' 대신'HyperlinkedRelatedField' (또는'HyperlinkedIdentityField') 여야합니다! – Matt3o12

관련 문제