Django Rest框架超链接字段理解

时间:2016-06-09 23:03:30

标签: django django-rest-framework

我似乎无法掌握HyperlinkedIdentity和HyperlinkedRelated Fields之间的区别。我有几个问题似乎无法找到在线答案。

实际差异是什么?我什么时候想要使用其中一个。

我的下一个问题是我有2个模型,项目和任务。

任务有一个ForeignKey到Project。如果我希望项目超链接到其中的任务,我将在ProjectSerializer中放置哪个超链接字段?假设我希望任务能够超链接回与它们相关的项目,那么我将在TaskSerializer中添加什么字段来补充ProjectSerializer?

使用超链接字段与仅使用常规嵌套序列化程序有什么区别?使用超链接字段时,我还可以按pk / id过滤吗?

最后,如果模型在序列化程序中有两个超链接关系怎么办?根据我的理解,它为每个超链接创建一个url字段,在这种情况下它会创建两个url字段吗?

感谢您提供的任何澄清,这将有助于巩固我对该主题的理解,并允许我为我的项目完成我的API。

1 个答案:

答案 0 :(得分:7)

  

实际差异是什么?我什么时候想要使用其中一个。

HyperlinkedIdentityField是当前对象本身的超链接字段,而HyperlinkedRelatedField表示指向其他实例的超链接。

  

任务有一个ForeignKey到Project。如果我希望项目超链接到其中的任务,我将在ProjectSerializer中放置哪个超链接字段?假设我希望任务能够超链接回与它们相关的项目,那么我将在TaskSerializer中添加什么字段来补充ProjectSerializer?

HyperlinkedRelatedField正是您要找的。

  

使用超链接字段与仅使用常规嵌套序列化程序有什么区别?

可以独立于原始资源浏览超链接。如果其中一个属于另一个系统,则很方便。例如,您可能希望使用超链接来发送推文,而不是让您的服务器获取它们并将它们返回嵌套。超链接还允许客户端处理自己的缓存,而不是发回所有数据。在获取嵌套同一用户的项列表时可以很方便。

另一方面,超链接会增加网络请求数,因为它需要获取更多数据。

  

使用超链接字段时,我仍然可以按pk / id过滤吗?

不确定你的意思。

  

如果模型在序列化程序中有两个超链接关系怎么办?根据我的理解,它为每个超链接创建一个url字段,在这种情况下它会创建两个url字段吗?

正确。超链接关系只是一种关系的表示。它提供了一个超链接(uri)来获取关联的对象。

这很有用,因为您不需要知道从id获取对象的模式:使用PrimaryKeyRelatedField您将获得id,但是缺少获取关联对象的URL。

这也允许服务器管理自己的uri空间,而无需更新客户端。

希望这会有所帮助。