Django Rest Framework使用动态字段进行序列化

时间:2015-11-02 11:19:24

标签: django serialization django-rest-framework

我遇到序列化问题。我有一个对象的查询集,例如:

uvs = UserVehicles.objects.all()

其中一些对象已过期,有些则未过期。我想在序列化器中有不同的字段,具体取决于到期信息。例如,我想从过期的对象中排除status和distance_travelled字段。实现这一目标的最简单方法是什么?我尝试使用下一个代码,但init方法中的self.object包含一个数组,因此它将删除所有对象的字段,而不仅仅是过期的字段。

serialized_data = UserVehicleSerializer(uvs, many=True).data

class UserVehicleSerializer(serializers.ModelSerializer):

    class Meta:
        model = UserVehicle
        fields = ('type', 'model', 'status', 'distance_travelled',)

    def __init__(self, *args, **kwargs):
        super(UserVehicleSerializer, self).__init__(*args, **kwargs)

        if self.object.is_expired:
            restricted = set(('distance_travelled', 'status',))
            for field_name in restricted:
                self.fields.pop(field_name)

2 个答案:

答案 0 :(得分:4)

您可以在序列化程序to_representation()中执行此操作。

http://www.django-rest-framework.org/api-guide/fields/#custom-fields包含Fields的示例,但Serializers确实从Field继承。 只需致电父母的to_representation并删除您不想要的字段。

答案 1 :(得分:2)

我建议将业务逻辑保留在序列化程序之外。您可以为过期的车辆/对象创建单独的序列化程序,为活动车辆创建单独的序列化程序,并在视图中选择正确的序列化程序。这样,如果您的业务逻辑针对每种类型的车辆走向不同的方向,那么它应该易于管理。

相关问题