Avinash Raj
Avinash Raj

Reputation: 174816

Django drf serializer can't get multiple instances in to_representation

My view class looks like,

views.py

class UserHierarchyOfOrganizations(viewsets.GenericViewSet, mixins.ListModelMixin):

    serializer_class = UserListOrganizationHierarchySerializer

    def get_queryset(self):
        user_ids = map(int, self.request.query_params['users'].split(','))
        return User.objects.filter(id__in=list(user_ids)).select_related('organization')

serializers.py

class UserOrganizationHierarchySerializer(serializers.ModelSerializer):
    # user_ids = serializers.ListField(
    #             child=serializers.IntegerField(min_value=1, validators=[]
    #             ), required=True
    #            )
    # user_id = serializers.IntegerField(min_value=1, read_only=True)
    # organizations = OrganizationReadOnlySerializer(read_only=True)

    class Meta:
        model = User
        fields = ('pk',)
        # read_only_fields = ('organizations','user_id')

    def to_representation(self, instance):
        out = super().to_representation(instance)
        print(out)
        out = OrganizationReadOnlySerializer(instance.organization).data
        print (out)
        return out

class UserListOrganizationHierarchySerializer(serializers.ModelSerializer):
    # organization_hierarchy = serializers.ReadOnlyField()
    #organization_hierarchy = serializers.ListField(child=UserOrganizationHierarchySerializer(read_only=True))
    organization_hierarchy = serializers.SerializerMethodField('_get_org_hierarchy')

    def _get_org_hierarchy(self, obj):
         print (type(obj))
         serializer = UserOrganizationHierarchySerializer(obj, many=True)
         return serializer.data

    class Meta:
        model = User
        fields = ('organization_hierarchy',)
        read_only_fields = ('organization_hierarchy',)

    def to_representation(self, instance):
        out = super().to_representation(instance)
        return out

But I'm getting single User instance in _get_org_hierarchy and to_representation methods instead of multiple User instances.

Is there any way to get multiple instances of User class(see get_queryset method) in UserListOrganizationHierarchySerializer serializer?

What I'm trying to achieve is,

{
  "organization_hierarchy": [ 
     {"id": 1, "organizations": "foo -> bar"},
  ]
}

Upvotes: 0

Views: 1263

Answers (1)

JPG
JPG

Reputation: 88619

As far I understood, you need to access your get_queryset() in your view, right ? Then try to replace your , _get_org_hierarchy(self, obj) by this,

def _get_org_hierarchy(self, obj):
    queryset = self.context['view'].get_queryset()  # to get results of get_queryset() from your view
    serializer = UserOrganizationHierarchySerializer(queryset, many=True)
    return serializer.data


Upvotes: 1

Related Questions