我目前正在开发一个项目,要求我很难创建。我们有一个使用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和序列化器更改,但它们似乎都没有完成任务。
答案 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
从特定实例的返回数据中删除字段,这样您就可以控制返回的字段。