我想过滤多个到多个字段的序列化,但我不需要像解释here那样创建视图或通用视图,因为我需要在另一个视图中使用数据
代码非常简单。模型中的位置是一个很多领域。
class ServiceSerializer(serializers.ModelSerializer):
locations = LocationSerializer(many=True)
# [...]
class Meta:
model = Service
LocationSerializer是:
class LocationSerializer(serializers.ModelSerializer):
# [...]
class Meta:
model = LocationAddress
# [...]
我希望序列化位置,但仅基于模型中的布尔字段。 活性=真。我怎么能这样做?
答案 0 :(得分:2)
如果您不需要序列化程序中的locations
字段可写,那么只需降至SerializerMethodField
即可获益。另一个选项是在序列化单个对象时动态删除locations
字段,如果返回的多个对象没有相同的active
标记,则会产生不一致的输出。
要使用SerializerMethodField
执行此操作,您只需在ServiceSerializer
上添加新方法。
class ServiceSerializer(serializers.ModelSerializer):
locations = SerializerMethodField("get_locations")
# [...]
class Meta:
model = Service
def get_locations(self, obj):
if obj.active:
return LocationSerializer(obj.locations.all(), many=True)
return None
这将使locations
成为只读,这可能不是您所希望的。这也意味着locations
会在null
未激活时返回to_representation
,并且您可能一直在寻找完全删除密钥。
另一种选择是将密钥完全放在to_native
(DRF 2.x中的class ServiceSerializer(serializers.ModelSerializer):
locations = LocationSerializer(many=True)
# [...]
class Meta:
model = Service
def to_representation(self, obj):
rep = super(ServiceSerializer, self).to_representation(obj)
del rep["locations"]
return rep
)方法中。
{{1}}