为什么我不能获得这个简单的Python字典的键/值对?

时间:2014-02-25 23:49:56

标签: python django rest dictionary

我正在使用Django-Rest-Framework为Django应用程序构建一个restful API。

在viewset函数中,我正在检查响应的值,并试图找出我可以调用它的方法。我是通过打印简单的日志消息来做到这一点的。但是,当我尝试在QueryDict上调用其中一个方法(键)(毕竟它只是一个字典)时,我得到错误: TypeError:'dict'对象的描述符'keys'需要一个参数< / strong>即可。为什么?我该如何解决?

>>> logger.info("request.QueryDict = %s" % request.QueryDict)
[2014-02-25 17:21:30] INFO [myApp.views:2352] request.QueryDict = <class 'django.http.request.QueryDict'>
# Works!


>>> logger.info("dir(request.QueryDict) = %s" % dir(request.QueryDict))
[2014-02-25 17:21:30] INFO [myApp.views:2354] dir(request.QueryDict) = ['__class__', '__cmp__', '__contains__', '__copy__', '__deepcopy__', '__delattr__', '__delitem__', '__dict__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getstate__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_assert_mutable', '_encoding', '_iteritems', '_iterlists', '_itervalues', '_mutable', 'appendlist', 'clear', 'copy', 'dict', 'encoding', 'fromkeys', 'get', 'getlist', 'has_key', 'items', 'iteritems', 'iterkeys', 'iterlists', 'itervalues', 'keys', 'lists', 'pop', 'popitem', 'setdefault', 'setlist', 'setlistdefault', 'update', 'urlencode', 'values', 'viewitems', 'viewkeys', 'viewvalues']
# Works!


>>> logger.info("request.QueryDict.keys() = %s" % request.QueryDict.keys())
TypeError: descriptor 'keys' of 'dict' object needs an argument
# Fails!

1 个答案:

答案 0 :(得分:7)

QueryDict是一个类,类似于dict类。

.keys()是一个实例方法,但是你在类上调用它,所以你需要将实例传递给方法

>>> mydict = {'key': 'value'}
>>> mydict.keys()        # instance method, works
['key']
>>> dict.keys()          # no argument, on class, same error you get
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: descriptor 'keys' of 'dict' object needs an argument
>>> dict.keys(mydict)    # passing in mydict
['key']

修改

经过一些研究后,看起来request.GETrequest.POST都是request.QueryDict 实例。因此,您要调用的是request.QueryDict.keys(),而不是request.GET.keys()

{{1}}