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

Yeo*_*Yeo 5 django rest django-rest-framework

此问题是基于Django-Rest-Framework更新外键BY Id得出的.

我有一个类似的问题.我爱HyperlinkedModelSerializer.我可以从我的网络浏览器(例如Chrome,FF等)浏览API的所有链接,但是当我尝试使用API​​时,我在客户端应用程序中有很多工作要做.我对GET请求没有任何问题.在POST使用ForeignKey更新模型时的请求中,我需要在向服务器发出POST请求之前从客户端应用程序(例如AngularJS,Android等)构造URL.我知道ModelSerializer哪个从客户端应用程序解决了问题,但它无法从Web浏览器导航.

我不确定在设计可浏览的REST API时有什么好方法.我不确定大多数人如何解决这个问题,当他们想要创建一个可浏览的REST API时,他们不希望在制作之前通过解析URL-ID来增加客户端应用程序的复杂性POST请求.或者这可能只是我的问题,没有身体遇到.

为什么不HyperlinkedModelSerializer这样做呢.

  • 根据GET请求返回URL中的所有ForeignKey .这样开发人员就可以从他们的Web浏览器中导航API.
  • 根据POST要求接受身份证.因此,开发人员只需传递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/"}]
Run Code Online (Sandbox Code Playgroud)

问题:

  • 目前的设计有HyperlinkedModelSerializer什么优势?

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

  • 怎么做到呢?

alm*_*lki 1

我认为根本不需要构建 URL。当您发送外键时,您基本上是在引用另一个对象。您应该已经知道这个另一个对象的标识符。在您的示例中,用户 ID 为 1。如果您围绕 构建 API HyperlinkedModelSerializer,则用户对象将带有自己的标识符:url。在创建favorite_industries对象之前,您需要知道要与哪个用户关联。在正常情况下,您将拥有包含其 url 的用户对象:

{
   "url" : "http://localhost:8000/users/1",
   "name": "Yeo"
}
Run Code Online (Sandbox Code Playgroud)

您所需要做的就是将此标识符作为外键发送:

data = {
    'user': 'http://localhost:8000/users/1',
    'industry': 'http://localhost:8000/industries/1'
}
Run Code Online (Sandbox Code Playgroud)

我之所以说在正常情况下,是因为通常在您的客户端应用程序中,用户不会输入 ID,但会显示名称等其他信息,供用户选择哪些命令具有完整的用户对象(包括其 url)。