此问题源自Django-Rest-Framework updating a foreign key BY Id。
我有一个类似的问题。我爱HyperlinkedModelSerializer
。我可以从我的网络浏览器(例如Chrome,FF等)浏览API的所有链接,但是当我尝试使用API时,我在客户端应用程序中有很多工作要做。我对GET
请求没有任何问题。在使用ForeignKey更新模型时的POST
请求中,我需要在向服务器发出POST请求之前从客户端应用程序(例如AngularJS,Android等)构造URL。我知道从客户端应用程序解决问题的ModelSerializer
,但它无法从Web浏览器导航。
我不确定在设计可浏览的REST API时有什么好方法。我不确定大多数人如何解决这个问题,当他们想要创建一个可浏览的REST API时,他们不希望在制作之前通过解析URL-ID来增加客户端应用程序的复杂性POST
请求。或者这可能只是我遇到的身体问题。
为什么不HyperlinkedModelSerializer
执行以下操作。
GET
请求时返回URL中的所有ForeignKey。这样开发人员就可以从他们的Web浏览器中导航API。POST
请求时接受ID。因此,开发人员只需传递ID,而不必从客户端应用程序构建完整的URL。示例:
c = Client()
data = {
'user': '1',
'industry': '1'
}
c.post('http://localhost:8000/favorite_industries/', json.dumps(data), 'application/json')
response = c.get('http://localhost:8000/favorite_industries/')
print(response.content)
# [{"id": 1, "user": "http://localhost:8000/users/1/", "industry": "http://localhost:8000/industries/1/"}]
问题:
HyperlinkedModelSerializer
的当前设计有什么优势?
我的建议可能有什么缺点?
怎么做?
答案 0 :(得分:1)
我根本不需要构建网址。当您发送外键时,您基本上是引用另一个对象。这个其他对象你应该已经知道它的标识符。在您的示例中,用户ID为1.如果围绕HyperlinkedModelSerializer
构建API,则用户对象将带有自己的标识符:url。在创建favorite_industries
对象之前,您需要知道要关联的用户。在正常情况下,您将拥有用户对象,包括其URL:
{
"url" : "http://localhost:8000/users/1",
"name": "Yeo"
}
您需要做的就是将此标识符作为外键发送:
data = {
'user': 'http://localhost:8000/users/1',
'industry': 'http://localhost:8000/industries/1'
}
我说在正常情况下,因为通常在您的客户端应用ID不会被用户输入,但会显示其他信息,如名称,以便用户选择具有完整用户对象(包括其URL)的任务。