How to serialize nested generic relations in django rest frame work

199 Views Asked by At

there is a little bit complex model in the project. There are three models bind to each other by generic relations.

Here is the example models:

class Person(models.Model):
    first_name = models.CharField()
    last_name = models.CharField()
    ptype = models.CharField()
    mapping = models.ForeignKey("Mapping", related_name="mapping")

class Profile(models.Model):
    rank = models.CharField()
    company = models.ForeingKey("Company")

class Company(models.Model:
    name = models.Charfield()

class Mapping(models.Model):
    origin_person_ctype = models.ForeignKey(ContentType, related_name="origin_mapping")
    origin_person_id = models.PositiveIntegerField()
    origin_person_object = GenericForeignKey('origin_person_ctype', 'origin_person_id')
    mapped_profile_ctype = models.ForeignKey(ContentType, related_name="mapped_mapping")
    mapped_profile_id = models.PositiveIntegerField()
    mapped_profile_object = GenericForeignKey('mapped_profile_ctype', 'mapped_profile_id')
    company = models.ForeignKey("Company")

And there is a Rest API for getting data from Person model.

class PersonAPIView(generics.RetrieveUpdateAPIView):

    serializer_class = PersonSerializer
    lookup_url_kwarg = 'person_id'

    def get_queryset(self):
        return Person.objects.all().prefetch_related(
            "mapping",
            "mapping__mapped_profile_object",
            "mapping__company"
        )

class PersonSerializer(serializers.ModelSerializer)
    class Meta:
        model = Person
        fields = (
            'id',
            'first_name',
            'last_name',
            'type',
        )

Now, I have to add Company.name and Profile.rank as nested dictionary list in PersonSerializer class.

How can I serialize that generic relation values like this:

[
    {"company1": "rank1"},
    {"company2": "rank2"}
    etc...
]
0

There are 0 best solutions below