【问题标题】:Merging django-rest-framework results合并 django-rest-framework 结果
【发布时间】:2017-07-07 14:06:58
【问题描述】:

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

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

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

[
    {
        "username": "admin",
        "access": [
            {
                "name": "foo"
            },
            {
                "name": "bar"
            }
        ],
        "group_affiliation": [
            {
                "access": [
                    {
                        "name": "eggs"
                    },
                    {
                        "name": "foo"
                    }
                ],
            },
        ]
    },
]

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

[
    {
        "username": "admin",
        "access": [
            {
                "name": "foo"
            },
            {
                "name": "bar"
            },
            {
                "name": "eggs"
            }
        ],
    }
]

这是我的models.py:

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:

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

任何帮助将不胜感激。

【问题讨论】:

  • 您到底遇到了什么问题?您需要更具体,并且只包含解释您的问题所需的最少代码量。 minimal reproducible example
  • @HåkenLid 我正在尝试将“group_affiliation”下显示的结果合并到其余结果中。我编辑了代码,使其更简洁
  • 使用序列化方法字段来进行自定义输出
  • 覆盖序列化器的 to_representation(),从这个函数返回你的自定义对象。

标签: django django-rest-framework


【解决方案1】:

感谢 @zaphod100.10 和 Betelgeuse V 的人们为我指出正确的方向,以及其他 post 为我提供语法。

这是我的解决方案:

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

上面列出的期望结果

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-16
    • 2016-08-03
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    • 2016-12-21
    相关资源
    最近更新 更多