2014-08-29 74 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

相关问题