Django-Rest-Framework,使用HyperlinkedModelSerializer时,按ID更新外键

时间:2014-02-23 06:40:23

标签: django rest django-rest-framework

此问题源自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的当前设计有什么优势?

  • 我的建议可能有什么缺点?

  • 怎么做?

1 个答案:

答案 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)的任务。