【问题标题】:What is different between `request.data['param-name'] ` or `request.data.get('param-name')` in DjangoDjango中的`request.data['param-name']`或`request.data.get('param-name')`有什么不同
【发布时间】:2018-11-09 04:33:45
【问题描述】:
我尝试从 API 获取数据
1 request.data['param-name']
输出 -:'9121009000'
2request.data.get('param-name')
输出 -:'9121009000'
两者都给出相同的结果。
那么哪一个是最好用的获取数据以及为什么。
提前致谢
【问题讨论】:
标签:
python
django
python-3.x
django-rest-framework
django-views
【解决方案1】:
是的,它们都会为您提供相同的结果,但它们的不同之处在于它们检索给定键的数据的方式。为此,您需要了解 python 中的字典是如何工作的,让我们定义一个字典:
>>> kwarg = {'name': 'John'}
>>> kwarg['name']
'John'
>>> kwarg['age']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'age'
>>>
>>> kwarg.get('age', 25)
25
在上面的示例中,第一种方法中的键必须存在,而在第二种情况下,如果找不到键,我可以定义一个默认值。
【解决方案2】:
如果您执行request.data['key'] 调用,Python 将在幕后调用request.data 的__getitem__ 函数。我们可以阅读the documentation 并查看:
QueryDict.__getitem__(key)
返回给定key 的值。如果key 有多个
值,它返回最后一个值。 加薪
django.utils.datastructures.MultiValueDictKeyError 如果密钥是
不存在。 (这是 Python 标准 KeyError 的子类,所以
你可以坚持抓KeyError。)
而如果您执行request.data.get('key'), it will call the.get(..)` 函数,我们在documentantation 中看到:
QueryDict.get(key, default=None)
使用与__getitem__() 相同的逻辑,带有一个钩子用于返回一个
如果键不存在,则为默认值。
所以这意味着如果密钥不存在,.get(..) 将返回 None,以防您没有提供默认值,或者如果您使用查询,它将返回给定的默认值request.data.get('key', somedefault).
通常在值是可选的情况下使用后者,并且您希望减少检查键是否存在的代码量。