Json 在REST-ful api中序列化外键字段的最佳实践是什么

Json 在REST-ful api中序列化外键字段的最佳实践是什么,json,django,rest,serialization,django-rest-framework,Json,Django,Rest,Serialization,Django Rest Framework,我想用REST-ful api编写一个Django应用程序。Django REST框架提供了三个内置的模型序列化程序:ModelSerializer,它序列化为如下内容 { 'normal_field': 'value', 'foreign_key_field': 42 } { 'normal_field': 'value', 'foreign_key_field': 'http://domain/api/myothermodel/11' } 还有超链接的Mo

我想用REST-ful api编写一个Django应用程序。Django REST框架提供了三个内置的模型序列化程序:ModelSerializer,它序列化为如下内容

{
    'normal_field': 'value',
    'foreign_key_field': 42
}
{
    'normal_field': 'value',
    'foreign_key_field': 'http://domain/api/myothermodel/11'
}
还有超链接的ModelSerializer,它序列化成这样的东西

{
    'normal_field': 'value',
    'foreign_key_field': 42
}
{
    'normal_field': 'value',
    'foreign_key_field': 'http://domain/api/myothermodel/11'
}
我的问题是是否有另一种序列化数据的好方法,以便客户机直接知道哪些字段必须解析,哪些字段不需要解析

示例:接收此消息的客户端

{ 
    'foo': 'http://domain/api/myothermodel/11',
    'bar': 'http://otherdomain/api/myothermodel/12'
}
不知道foo或bar是否应该是可解析的外键字段而不是普通url。比如:

{ 
    'foo': 'http://domain/api/myothermodel/11', # Here the client might know that this is only a plain url.
    'bar': {
            '_foreignkey': true,  # Tells the client that this field should behave as a foreign key which has to be resolved first
            'url': 'http://otherdomain/api/myothermodel/12'
        }
}
是否有任何标准或最佳实践?或者,最好的做法是客户机不从JSON中知道这一点,而是从它拥有的或从服务器获得的其他代码中知道这一点


更新:可选您可以添加哪种方式是一些著名的客户端LIB(如AngularJS)的最佳实践。

看来您需要的是一个自我描述和可探索的web API服务,这实际上是原始REST概念的核心功能。本质上,与HATEOAS兼容的web服务不依赖于除初始URL入口点之外的系统资源的任何先验知识

这与单个服务基本上没有关联,并且需要事先知道它们的存在,才能将多个服务调用串在一起,以使用多个可能相关的资源完成某项任务的情况形成对比

大多数对RESTAPI的引用实际上不是完全RESTful的,应该更准确地描述为web API,因为它们更符合SOA设计:指向特定实例和特定类型实例集合的一组URL。这还包括使用不同的HTTP动词(GET、PATCH、POST、PUT)对这些资源执行各种操作。Django REST框架(DRF)实际上有一个关于这个主题的页面,链接到一些关于真正RESTful设计的重要资源,包括Roy Fielding的论文:

我推测,术语“restapi”的当前用法与许多开发人员的启示有关,即实现真正的RESTful服务绝非小事,在许多情况下,对于特定的用例来说,它的设计过于复杂。也许这是“完美是好的敌人”的一个很好的例子。对于使用AngularJS作为客户端框架通过DRF与Django后端交互的情况,这尤其正确。AngularJS框架中没有任何东西能够解析真正的RESTful设计,从而自动提供给定资源可能的各种应用程序状态。另外,同一个开发人员通常负责JavaScript和Python代码,因此缺少自描述API并不是开发的主要障碍

关于在JSON中实现真正的RESTful API,有两个项目试图促进这一点,即and。但是,我不知道DRF在本机上支持这两种方法,因此您可能需要构建序列化程序以符合其中一种方法,或者使用自己的Django REST实现


最后,无论您选择什么设计,完整地记录API通常是一个好主意。无论API是基于web的还是使用某些本机编程语言,这都是正确的。web API所提供的分离关注点的部分吸引力在于,第三方可以消耗资源来构建您没有考虑过的应用程序或管道,更不用说在将来更改项目的代码库时在可维护性方面的优势了。有几个有趣的项目可以帮助记录API。这是一个特别棒的问题,由提供较旧的Django REST Framework文档包的同一个开发人员开发。

这实际上是一个我自己都没有想到的有趣问题。对于我们来说,前端人员提前知道必须解决的问题,您能否澄清您所说的必须首先解决的外键是什么意思?通过解析,您的意思是相关实例在RESTAPI中有一个资源位置端点吗?而通过先解析,先解析什么具体操作?是的:“解析”表示数据代表获取相关实例的信息。“First”意味着我最终要在我的站点上显示实例和所有相关实例。因此,客户端必须遵循所有关系并在呈现页面之前获取实例。但是:在我的第一个例子中,数据是这样的“可解析”信息,而不仅仅是一些简单的数据,这是不言而喻的。我明白了,你的目标是一个自我描述的API,或多或少类似于HATEOAS。顺便说一句,JSON还没有这方面的标准,尽管有一些标准。无论您选择什么设计,记录API都是一个好主意。@Fiver:谢谢。如果你把你的帖子设为答案,我可以接受它并(稍后)奖励赏金。太好了。我会和我的同事讨论这个问题,我们会看看用什么。非常感谢你。