Django Rest框架使用动态字段序列化

Django Rest框架使用动态字段序列化,django,serialization,django-rest-framework,Django,Serialization,Django Rest Framework,我对序列化有问题。我有一个对象查询集,例如: uvs = UserVehicles.objects.all() 有些对象已过期,有些则未过期。我希望序列化程序中有不同的字段,具体取决于到期信息。例如,我想从过期对象中排除状态和距离字段。实现这一目标最简单的方法是什么?我尝试使用下一个代码,但init方法中的self.object包含一个数组,所以它将删除所有对象的字段,而不仅仅是过期的对象 serialized_data = UserVehicleSerializer(uvs, many=Tr

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

uvs = UserVehicles.objects.all()
有些对象已过期,有些则未过期。我希望序列化程序中有不同的字段,具体取决于到期信息。例如,我想从过期对象中排除状态和距离字段。实现这一目标最简单的方法是什么?我尝试使用下一个代码,但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)

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

有字段示例,但序列化程序确实从字段继承。
只需调用父级的to_表示并删除您不需要的字段。

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