【问题标题】:Django-Rest-Framework, update foreign key by ID when using HyperlinkedModelSerializerDjango-Rest-Framework,使用 HyperlinkedModelSerializer 时按 ID 更新外键
【发布时间】:2014-03-24 18:38:05
【问题描述】:

本题来源于Django-Rest-Framework updating a foreign key BY Id

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

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

为什么不HyperlinkedModelSerializer 改为执行以下操作。

  • 根据GET 请求返回URL 中的所有ForeignKey。这样开发人员就可以从他们的网络浏览器中导航 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 的当前设计有什么优势?

  • 我的建议有什么缺点?

  • 怎么做?

【问题讨论】:

  • 正是我想要的(并期望成为默认行为)。您是否偶然找到了解决方案?

标签: django rest django-rest-framework


【解决方案1】:

我认为根本不需要构建 URL。当您发送外键时,您基本上是在引用另一个对象。这个其他对象您应该已经知道它的标识符。在您的示例中,用户 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。

【讨论】:

  • 请帮帮我。我有一个多对多字段,我正在传递一个 url 数组,但是 django 在验证时会忽略它们。我正在尝试深入研究 django 源代码,但我什么也没找到,也无法在互联网上找到答案。
  • 好的,我找到了解决方案。我必须将该字段设置为“非只读”(read_only=False),但这样做我必须添加一个查询集来更新该字段(queryset=Table.objects.all())。现在一切正常。
猜你喜欢
  • 2013-10-24
  • 2017-06-23
  • 2017-08-15
  • 2016-01-09
  • 1970-01-01
  • 2021-06-25
  • 2017-04-14
  • 2019-07-02
  • 2018-12-16
相关资源
最近更新 更多