2014-08-29 46 views
3

我使用django的rest框架來顯示有關用戶的信息。每個用戶都有一些保存在UserProfile中的聯繫人(用戶配置文件使用一對一關係)。可以直接在用戶模型中訪問聯繫人(user.contacts)。
我想顯示用戶的所有聯繫人的名稱(和URL)。我寫了下面串行:Django Rest Framework - 嵌套用戶中的用戶配置文件

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": [ 
    { 
     "user": 2 
    }, 
    { 
     "user": 1 
    } 
    ] 
} 

,但我希望它是:

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

我怎樣才能做到這一點?我已經嘗試爲聯繫人用戶添加另一個序列化程序,但引發了類型錯誤:'用戶'對象不可迭代,JSON結構看起來有點尷尬:{contacts:[user:{「username:... },]},如果他對Django的User Profile沒有信心,這可能會讓API的用戶感到困惑。

回答

6

您的ContactsSerializer需要爲HyperlikedModelSerializer,以便url字段自動添加。由於您需要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

完美工作,但它應該是'HyperlinkedRelatedField'(或'HyperlinkedIdentityField')而不是'HyperlinkedModelSerializer'! – Matt3o12 2014-08-30 09:02:26

相關問題