Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有选择地显示Django REST序列化程序字段_Python_Django_Rest_Django Rest Framework - Fatal编程技术网

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

Python 有选择地显示Django REST序列化程序字段,python,django,rest,django-rest-framework,Python,Django,Rest,Django Rest Framework,我目前正在做一个项目,有一个我很难创建的需求。我们有一个使用Django REST构建的API,我们希望能够在端点上只显示更改的数据 现在,我们在端点上有一个功能,只有在进行更改时才返回页面。为了在GET请求中实现这一点,输入是UNIX时间,然后将其转换为时间戳,然后将时间戳与表示最后一次通过Django的内置auto_now修改被序列化的模型的字段进行比较 例如: ...api.sample.com/endpoint/?request_time=1418929272.543132 <--

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

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

例如:

...api.sample.com/endpoint/?request_time=1418929272.543132 <-- UNIX time stamp
我想做的是让这种请求只返回已更改的字段:

 {
    # Only field 1 and field 5 have changed since the specified time stamp
    "field1": "data1", 
    "field5": "data5", 
 }

我一直在努力让这个建立了一段时间,并没有找到一个令人满意的解决方案。尽管完整的答案会很好,但如果有人能在这里为我指出正确的方向,我会很高兴。我一直在使用django模型UTIL和一系列不同的混入和序列化程序更改,但它们似乎都没有完成任务。

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

但我可以回答标题中的问题

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

这在Django REST框架中是可能的,实际上在中稍微提到了这一点。通过使用文档中提供的mixin,可以提前对序列化程序中的所有字段执行此操作。如果需要在序列化程序中逐个对象地执行此操作,还可以在序列化程序上重写为_表示

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从特定实例的返回数据中删除该字段,这将允许您控制返回的字段。

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

但我可以回答标题中的问题

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

这在Django REST框架中是可能的,实际上在中稍微提到了这一点。通过使用文档中提供的mixin,可以提前对序列化程序中的所有字段执行此操作。如果需要在序列化程序中逐个对象地执行此操作,还可以在序列化程序上重写为_表示

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从特定实例的返回数据中删除该字段,这将允许您控制返回的字段。

我认为您几乎必须在每个字段旁边包含上次修改的日期,或者将历史存储在一个单独的表中,以便与当前版本进行比较。另外,如果客户端的时间不对怎么办?或者你认为它足够近是安全的吗?另一个问题是,这值得吗?您可能会发现,除非有数百个字段,否则进行此比较比发送整个模型需要更多的工作和处理。首先,感谢您的输入。你很可能是对的——我只是希望有一种方法可以做到这一点,而不需要在数据库中添加大量额外的时间戳字段。至于时区,这不会仅仅因为访问端点的方式而成为问题。我认为您几乎必须在每个字段旁边包含上次修改的日期,或者将历史存储在单独的表中,以便与当前版本进行比较。另外,如果客户端的时间不对怎么办?或者你认为它足够近是安全的吗?另一个问题是,这值得吗?您可能会发现,除非有数百个字段,否则进行此比较比发送整个模型需要更多的工作和处理。首先,感谢您的输入。你很可能是对的——我只是希望有一种方法可以做到这一点,而不需要在数据库中添加大量额外的时间戳字段。至于时区,这不会仅仅因为访问端点的方式而成为问题。