Django Rest Framework动态字段序列化

gma*_*map 5 django serialization django-rest-framework

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

uvs = UserVehicles.objects.all()
Run Code Online (Sandbox Code Playgroud)

这些对象中有一些已过期,有些则没有。我想在序列化程序中有不同的字段,具体取决于到期信息。例如,我想从过期对象中排除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)
Run Code Online (Sandbox Code Playgroud)

bir*_*ngh 5

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