基于方向的Django Rest Framework深度

0 投票
1 回答
1415 浏览
提问于 2025-04-18 05:14

我有两个模型:

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',)

撰写回答