【问题标题】:Conditionally choose serializer有条件地选择序列化器
【发布时间】:2016-08-08 14:33:21
【问题描述】:
我有三个 Django 模型。
class Asset(models.Model):
name = models.CharField(max_length=255)
class Place(Asset):
location = PointField()
class Zone(Asset):
location = PolygonField()
我想为 Place 和 Zone 使用相同的端点。
是否可以为每个请求决定将使用哪个序列化程序,例如我可以轻松检查请求的资产是地点还是区域?
我只对处理单个实例感兴趣,因此不需要处理 ListView 等。
【问题讨论】:
标签:
django
django-rest-framework
django-rest-framework-gis
【解决方案1】:
您可以在视图中覆盖get_serializer_class 方法,并在此处添加用于确定正确序列化程序的逻辑。
根据DRF docs:
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