Django REST Framework序列化时如何完全排除符合条件的返回对象
实现序列化实例过滤的两种方案
方案1:查询集层面过滤(推荐,性能最优)
优先在视图层的查询集阶段就把不符合条件的实例过滤掉,避免无效的序列化计算,性能最好。
示例代码:
# 视图层实现 from rest_framework import viewsets class TradeViewSet(viewsets.ModelViewSet): serializer_class = TradeSerializer def get_queryset(self): # 直接在数据库查询阶段过滤符合条件的记录 return Trade.objects.filter(countdown__gte=5)
方案2:序列化层过滤(适用于过滤逻辑依赖序列化后字段的场景)
如果你的过滤条件需要基于序列化后的计算结果才能判断,就需要自定义列表序列化器,在列表序列化阶段剔除返回None的项:
- 先自定义支持过滤的ListSerializer
from rest_framework import serializers class FilteredListSerializer(serializers.ListSerializer): def to_representation(self, data): items = super().to_representation(data) # 过滤掉所有返回None的项 return [item for item in items if item is not None]
- 在你的TradeSerializer中绑定自定义的列表序列化器,原有to_representation逻辑保持不变即可
class TradeSerializer(serializers.ModelSerializer): class Meta: model = Trade # 新增指定列表序列化类 list_serializer_class = FilteredListSerializer fields = "__all__" # 保持你原有字段配置不变 def to_representation(self, instance): ret = super().to_representation(instance) if ret['countdown'] < 5: return None return ret
内容的提问来源于stack exchange,提问作者Dean Christian Armada
相关产品推荐
相关产品推荐

