4

I have three Django models.

class Asset(models.Model):
  name = models.CharField(max_length=255)


class Place(Asset):
  location = PointField()


class Zone(Asset):
  location = PolygonField()

I want to use the same endpoint for Place and Zone. Is it possible to decide for each request which serializer will be used e.g. I could easily check if the requested Asset is a Place or a Zone?

I am only interested in handling a single instance hence there is no need to handle ListView etc.

Helgi
  • 338
  • 2
  • 5
  • 11

1 Answers1

7

You can override the get_serializer_class method in your view and add the logic for deciding the correct serializer there.

As per the DRF docs:

get_serializer_class(self)

Returns the class that should be used for the serializer. Defaults to returning the serializer_class attribute.

May be overridden to provide dynamic behavior, such as using different serializers for read and write operations, or providing different serializers to different types of users.

Code:

class MyView(..):
    ...

    def get_serializer_class(self):
        if asset == place: # here add the logic to decide the asset type
             return PlaceSerializer 
        return ZoneSerializer 
Rahul Gupta
  • 46,769
  • 10
  • 112
  • 126