有选择地显示Django REST序列化器字段

时间:2014-12-19 00:32:33

标签: python django rest django-rest-framework

我目前正在开发一个项目,要求我很难创建。我们有一个使用Django REST构建的API,我们希望能够仅在端点上显示已更改的数据。

现在我们在端点上有一个功能,只有在进行了更改后才返回页面。为了在GET请求中工作,输入是UNIX时间,然后将其转换为时间戳,然后将其与表示上次序列化模型被修改的字段进行比较(通过Django的内置{{1 }})。

例如:

auto_now

如果在此时间戳之后任何模型的字段中发生任何类型的更改,则返回整个端点:

...api.sample.com/endpoint/?request_time=1418929272.543132 <-- UNIX time stamp

我希望能够做的是这种请求只返回已更改的字段:

 {
    "field1": "data1", 
    "field2": "data2", 
    "field3": "data3", 
    "field4": "data4", 
    "field5": "data5", 
    "field6": "data5",
 }

我一直在努力让这个建立一段时间,并没有找到一个令人满意的解决方案。尽管一个完整的答案会很好,但如果有人能指出我在这里正确的方向,我会很高兴。我一直在玩 { # Only field 1 and field 5 have changed since the specified time stamp "field1": "data1", "field5": "data5", } 和一些不同的mixins和序列化器更改,但它们似乎都没有完成任务。

1 个答案:

答案 0 :(得分:4)

您必须拥有能够存储每个字段的最后修改时间的内容,无论是在数据库,缓存还是其他一些神奇的地方。 Django无法知道上次更新字段的时间,因为这不是通常需要存储的信息。

但我可以在标题中回答这个问题

  

如何有选择地在序列化器上显示字段?

这在Django REST Framework中是可行的,它实际上在the Dynamically modifying field section of the serializers documentation中略有提及。您可以使用文档中提供的mixin提前为序列化程序中的所有字段执行此操作。如果需要在序列化程序中逐个对象地执行此操作,还可以在序列化程序上覆盖to_representation

class DemoSerializer(serializers.Serializer):

    def to_representation(self, instance):
        data = super(DemoSerializer, self).to_representation(instance)

        instance_type = data["type"]

        if field_last_modified < last_modified:
            data.pop("field")

        return data

您可以使用pop从特定实例的返回数据中删除字段,这样您就可以控制返回的字段。