【问题标题】:Django Rest Framework depth based on directionDjango Rest Framework 深度基于方向
【发布时间】:2014-05-03 15:17:39
【问题描述】:

我有两个模型:

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 属性,但我一辈子都想不通。如果有人能指出我正确的方向,我将不胜感激。

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    问题是您希望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',)
    

    【讨论】:

    • 太棒了,非常感谢!我知道有一个简单的解决方案,我只是让它变得比它应该的更复杂。再次感谢。
    • 没问题!很高兴为您提供帮助。
    猜你喜欢
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 2015-11-10
    • 2020-06-21
    • 1970-01-01
    相关资源
    最近更新 更多