基于方向的Django Rest Framework深度
我有两个模型:
class Organization(models.Model):
name = models.CharField(max_length=64)
class OrgUser(User):
organization = models.ForeignKey(Organization, related_name='users')
role = models.CharField(max_length=1, choices=USER_TYPE_CHOICES)
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = OrgUser
depth = 1
fields = ('email', 'role', 'organization',)
class OrganizationSerializer(serializers.HyperlinkedModelSerializer):
users = USerSerializer(many=True)
class Meta:
model = Organization
depth = 1
fields = ('name', 'users',)
我正在使用Django REST框架,想要在给定的URL上得到以下输出:
GET /organization/
{
'name':'Hello World',
'users':[{ 'email':'test@gmail.com', 'role':'A' }]
}
GET /user/
{
'email':'test@gmail.com',
'role':'A',
'organization':{ 'name':'Hello World' }
}
现在的问题是,当我请求GET /organization/
时,它给我返回了用户数组和组织的信息,又一次。
我一直在想办法设置我的序列化器中的depth
属性,但就是搞不明白。如果有人能给我指个方向,我会非常感激。
1 个回答
4
问题在于,你希望你的 UserSerializer
在不同情况下输出不同的内容,比如当它单独使用时(比如在 GET /user/
这个请求中),或者作为嵌套关系使用时(比如在 GET /organization/
这个请求中)。
假设你想在这两种情况下显示不同的字段,你可以创建一个新的 Serializer
,专门用于嵌套关系,这个新的序列化器只包含你想在 OrganizationSerializer
中显示的字段。虽然这样做可能不是最优雅的方式,但目前我找不到其他的替代方案。
示例代码:
class Organization(models.Model):
name = models.CharField(max_length=64)
class OrgUser(User):
organization = models.ForeignKey(Organization, related_name='users')
role = models.CharField(max_length=1, choices=USER_TYPE_CHOICES)
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = OrgUser
depth = 1
fields = ('email', 'role', 'organization',)
class OrganizationUserSerializer(serializers.HyperlinkedModelSerializer): # New Serializer
class Meta:
model = OrgUser
depth = 1
fields = ('email', 'role',)
class OrganizationSerializer(serializers.HyperlinkedModelSerializer):
users = OrganizationUserSerializer(many=True) # Change to new serializer
class Meta:
model = Organization
depth = 1
fields = ('name', 'users',)