【问题标题】:Django Rest Framework serializing with dynamic fieldsDjango Rest Framework 使用动态字段进行序列化
【发布时间】:2015-11-02 11:19:24
【问题描述】:

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

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)

【问题讨论】:

    标签: django serialization django-rest-framework


    【解决方案1】:

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

    http://www.django-rest-framework.org/api-guide/fields/#custom-fields 有字段的示例,但序列化程序确实继承自字段。 只需调用父级的 to_representation 并删除不需要的字段。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-12
        • 2013-07-07
        • 2016-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-09
        相关资源
        最近更新 更多