首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合并django-rest-framework结果

合并django-rest-framework结果
EN

Stack Overflow用户
提问于 2017-07-07 22:06:59
回答 1查看 1K关注 0票数 1

我正在制作我的第一个API,它几乎就是我想要的。我试图让用户既可以单独访问,也可以通过他们的组访问,但我希望将API设置为直接显示用户拥有的所有访问权限,而不是将其嵌入到组中。

基本上,我希望获取group_affiliation结果并将它们合并到其余结果中,因为它们具有相同的结构,并且在该格式中更易于使用。

目前,我的输出如下所示:

代码语言:javascript
复制
[
    {
        "username": "admin",
        "access": [
            {
                "name": "foo"
            },
            {
                "name": "bar"
            }
        ],
        "group_affiliation": [
            {
                "access": [
                    {
                        "name": "eggs"
                    },
                    {
                        "name": "foo"
                    }
                ],
            },
        ]
    },
]

但我希望它看起来更像这样,将group_affiliation结果合并到其他结果中:

代码语言:javascript
复制
[
    {
        "username": "admin",
        "access": [
            {
                "name": "foo"
            },
            {
                "name": "bar"
            },
            {
                "name": "eggs"
            }
        ],
    }
]

这是我的models.py:

代码语言:javascript
复制
class Access(models.Model):
    name = models.CharField(max_length=100)
    site_user_access = models.ManyToManyField(User, blank=True)
    site_group_access = models.ManyToManyField(Group, blank=True)

下面是我的serializers.py:

代码语言:javascript
复制
class AccessSerializer(serializers.ModelSerializer):
    class Meta:
        model = TopAccess
        fields = ('name', )


class GroupSerializer(serializers.ModelSerializer):
    access = AccessSerializer(
            source='access_set',
            many=True
            )

    class Meta:
        model = Group
        fields = (
                'access',
                )


class UserAccessSerializer(serializers.ModelSerializer):
    access = AccessSerializer(
            source='access_set',
            many=True
            )
    group_affiliation = GroupSerializer(
            source='groups',
            many=True,
            )

    class Meta:
        model = User
        fields = (
                'username',
                'access',
                'group_affiliation',
                )

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-10 21:12:08

感谢@zaphod100.10和Betelgeuse V的人们为我指明了正确的方向,也感谢这个post给我提供了语法。

以下是我的解决方案:

代码语言:javascript
复制
class AccessSerializer(serializers.ModelSerializer):
    class Meta:
        model = Access
        fields = ('name', )


class UserAccessSerializer(serializers.ModelSerializer):
    access = SerializerMethodField('access_set')

    class Meta:
        model = User
        fields = (
                'username',
                'access',
                )

    def access_set(self, user):
        queryset = Access.objects.filter(site_user_access=user)
        queryset = queryset | Access.objects.filter(site_group_access__user=user)
        queryset = queryset.distinct()
        serializer = AccessSerializer(instance=queryset, many=True)
        return serializer.data

,它们给出了上面列出的预期结果。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44972852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档