2017-07-07 76 views
0

我正在制作我的第一个API,它几乎是我想要的。我试图让用户既可以单独访问,也可以通过他们的组访问,但我想设置API来显示用户明白的所有访问权限,而不是将其嵌入到组中。合并django-rest-framework结果

基本上,我想取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', 
       ) 

任何帮助将不胜感激。

+0

,你究竟有什么问题,列出所需的结果呢?您需要更具体,并且只包含解释问题所需的最少量代码。 [mcve] –

+0

@HåkenLid我试图将显示在“group_affiliation”下的结果合并到其他结果中。我编辑了代码以便它更简洁 – joedurbak

+1

使用串行器方法字段使您的自定义输出 –

回答

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 

这给上述