有条件地选择序列化器

Hel*_*lgi 4 django django-rest-framework django-rest-framework-gis

我有三个 Django 模型。

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


class Place(Asset):
  location = PointField()


class Zone(Asset):
  location = PolygonField()
Run Code Online (Sandbox Code Playgroud)

我想对地点和区域使用相同的端点。是否可以为每个请求决定使用哪个序列化器,例如我可以轻松检查请求的资产是一个地方还是一个区域?

我只对处理单个实例感兴趣,因此不需要处理 ListView 等。

Rah*_*pta 7

您可以重写视图中的get_serializer_class方法并添加用于决定正确序列化器的逻辑。

根据DRF 文档:

get_serializer_class(self)

返回应用于序列化器的类。默认返回serializer_class属性。

可以被重写以提供动态行为,例如使用不同的序列化器进行读写操作,或者为不同类型的用户提供不同的序列化器。

代码:

class MyView(..):
    ...

    def get_serializer_class(self):
        if asset == place: # here add the logic to decide the asset type
             return PlaceSerializer 
        return ZoneSerializer 
Run Code Online (Sandbox Code Playgroud)