2014-02-23 40 views
5

此问题基于Django-Rest-Framework updating a foreign key BY Id派生。Django-Rest-Framework,使用HyperlinkedModelSerializer时通过ID更新外键

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

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

为什么不用HyperlinkedModelSerializer代替以下内容。

  • 请求返回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

正是我想要的(并且预期是默认行为)。你有没有找到解决办法? – Ariel

回答

1

我根本没有看到需要构建URL。当你发送外键时,你基本上是引用另一个对象。这另一个对象,你应该已经知道它的标识符。在您的示例中,用户标识为1.如果您在HyperlinkedModelSerializer左右构建API,则用户对象将带有自己的标识符:url。在创建您的favorite_industries对象之前,您需要知道与哪个用户关联。在正常情况下,你将有用户对象包括它的网址:

{ 
    "url" : "http://localhost:8000/users/1", 
    "name": "Yeo" 
} 

所有你需要做的就是发送此标识为外键:

data = { 
    'user': 'http://localhost:8000/users/1', 
    'industry': 'http://localhost:8000/industries/1' 
} 

我在正常情况下说的,因为通常你客户端应用程序ID不是由用户输入的,而是显示其他信息,如用户名,以供用户选择具有完整用户对象(包括其URL)的哪些任务。

+0

请帮帮我。我有一个多到多的字段,我传递了一个url数组,但是django在验证时忽略它们。我试图深入django源代码,但我没有找到任何东西,我无法在互联网上找到答案。 –

+0

好的,我找到了解决方案。我不得不将字段设置为“不可读”(_read_only = False_),但这样做必须添加一个查询集来更新字段(_queryset = Table.objects.all()_)。现在一切正常。 –