Amistad
Amistad

Reputation: 7410

Reverse relationships in Nested serializer in django rest framework

My models.py is as as follows:

class Group(models.Model):
    name = models.CharField(max_length=50, unique=True)

class Policy(models.Model):
    name =  models.CharField(max_length=50, unique=True)
    source_group =  models.ForeignKey(Group, related_name='source_group')
    destination_group = models.ForeignKey(Group, related_name='destination_group')

Since I have two foreign keys, pointing to the same model, I am using related name to avoid clashes.

Now, when I try to create a serializer for Groups in order to list all Policies associated with it, I do the following:

class PolicySerializer(serializers.ModelSerializers):
    class Meta:
         model = Policy
         fields = "__all__"

class GroupSerializer(serializers.ModelSerializer):
    policy = PolicySnippetSerializer(source ='source_group', many=True)

    class Meta:
        model = Group
        fields = ['id', 'name', 'policy']

However, this will give me only policies for a a source_group.How did i get all groups associated with a group, source and destination ?

Upvotes: 2

Views: 2576

Answers (1)

Sachin
Sachin

Reputation: 3674

There can be two ways to do this.

  1. Using SerializerMethodField.
  2. By overriding data property method and appending the destination_group data into policy key.

Method 1:

class GroupSerializer(serializers.ModelSerializer):
    policy = serializers.SerializerMethodField()

    def get_policy(self, obj):
        source_groups = PolicySnippetSerializer(obj.source_group.all(), many=True).data
        destination_groups = PolicySnippetSerializer(obj.destination_group.all(), many=True).data

        return source_groups + destination_groups
# rest of the code

Method 2:

class GroupSerializer(serializers.ModelSerializer):
    policy = PolicySnippetSerializer(source ='source_group', many=True)

    @property
    def data(self):
        serializer_data = super().data()
        serializer_data['policy'] += PolicySnippetSerializer(self.instance.destination_group.all(), many=True).data

        return serializer_data

# rest of the code

Upvotes: 8

Related Questions