Django在POST请求中从id获取对象的最佳实践

时间:2018-04-03 08:47:33

标签: python django

在我的API中,有时你会发出带有id对象的HTTP请求(比如更新首选地址,你输入新默认地址的id)。

我像这样检索它:

address = get_object_or_404(
    Address.objects.filter(...), 
    pk=request.data['address_pk']
)

这完全是功能性的,但它并不是最好的方式。我试图寻找最佳实践,但是我无法找到能满足我好奇心的正确搜索词。

这种从请求获取模型实例的方法是一种好的做法吗?还是应该避免?

4 个答案:

答案 0 :(得分:0)

通常的做法是正确使用request对象。不是request.data

pk = request.POST.get('address_pk', 0)
address = get_object_or_404(Address, pk=pk)

您只能使用request.POST方法使用get

答案 1 :(得分:0)

如果您想知道使用request.data是否是最佳选择,那么回答这个问题就是比较request.POST和request.DATA

Compare request.POST and request.DATA

答案 2 :(得分:0)

pk=request.data['address_pk']

如果请求数据中不存在KeyError,则会引发address_pk。稍后,您会发现自己正在编写try...except块来处理它。

更简单的方法是使用dict.get方法。

request.data.get('address_pk') # this will default to None if key is absent

KeyError不会提升。这有助于减少3-4行代码。

但这可能并不总是最佳解决方案,因为当POST数据中没有特定密钥时,您可能希望发送400 Bd Request响应。在这种情况下,您必须为此编写try...except块。

答案 3 :(得分:0)

我可以想到一个更好的方法。

使用Django中的URL模式创建类似于此http://domain.name/address/(?P<id>[0-9]{*})/的URL,它将在URL中具有地址ID,并且可以作为参数id传递给视图,然后您可以使用它来检索地址以同样的方式。