Django Rest Framework过滤多个到多个字段

时间:2014-12-02 02:25:40

标签: python django serialization django-rest-framework

我想过滤多个到多个字段的序列化,但我不需要像解释here那样创建视图或通用视图,因为我需要在另一个视图中使用数据

代码非常简单。模型中的位置是一个很多领域。

class ServiceSerializer(serializers.ModelSerializer):
    locations = LocationSerializer(many=True)
    # [...]
    class Meta:
        model = Service

LocationSerializer是:

class LocationSerializer(serializers.ModelSerializer):
    # [...]
    class Meta:
        model = LocationAddress
        # [...]

我希望序列化位置,但仅基于模型中的布尔字段。 活性=真。我怎么能这样做?

1 个答案:

答案 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}}