JsonResponse对象和QueryDict对象
JsonResponse对象
JsonResponse是HttpResponse的子类,专门用来生成JSON编码的响应。class JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None,**kwargs)
from django.http import JsonResponse
response = JsonResponse({'foo': 'bar'})
print(response.content)
b'{"foo": "bar"}'
这个类是HttpRespon的子类,它主要和父类的区别在于:
- 它的默认Content-Type被设置为:
application/json
- 第一个参数,data应该是一个字典类型,第二个参数,关键字safe,当 safe 这个参数被设置为:False ,那data可以填入任何能被转换为JSON格式的对象,比如list, tuple等。默认的safe参数是 True. 如果你传入的data数据类型不是字典类型,那么它就会抛出 TypeError的异常。
response = JsonResponse([1, 2, 3], safe=False)
json_dumps_params
参数是一个字典,它将调用json.dumps()
方法并将字典中的参数传入给该方法。encoder
默认为django.core.serializers.json.DjangoJSONEncoder
,用于序列化数据。如果需要使用不同的JSON 编码器类,可以传递encoder参数给构造函数。response = JsonResponse(data, encoder=MyJSONEncoder)
#如果这样返回,ajax还需要进行json解析
#views.py
return HttpResponse(json.dumps({"msg":"ok!"}))
#index.html
var data=json.parse(data)
console.log(data.msg);
使用HttpResponse对象来响应数据的时候,还可以通过content_type指定格式:
return HttpResponse(json.dumps(data),content_type="application/json")
#如果这样返回,两边都不需要进行json的序列化与反序列化,ajax接受的直接是一个对象
#views.py
from django.http import JsonResponse
return JsonResponse({"msg":"ok!"})
#index.html
console.log(data.msg);
QueryDict对象
在HttpRequest对象中,GET和POST属性都是一个django.http.QueryDict
的实例。也就是说你可以按本文下面提供的方法操作request.POST和request.GET。
request.POST或request.GET的QueryDict都是不可变,只读的。如果要修改它,需要使用QueryDict.copy()方法,获取它的一个拷贝,然后在这个拷贝上进行修改操作。
方法
QueryDict 实现了Python字典数据类型的所有标准方法,因为它是字典的子类。
与字典数据类型的不同之处:
QueryDict实例化方法:
注意:QueryDict的键值是可以重复的!
QueryDict('a=1&a=2&c=3')
<QueryDict: {'a': ['1', '2'], 'c': ['3']}>
如果需要实例化可以修改的对象,添加参数mutable=True。
classmethod QueryDict.fromkeys(iterable, value='', mutable=False, encoding=None)[source]
循环可迭代对象中的每个元素作为键值,并赋予同样的值(来至value参数)。
QueryDict.fromkeys(['a', 'a', 'b'], value='val')
<QueryDict: {'a': ['val', 'val'], 'b': ['val']}>
QueryDict.update(other_dict)
追加内容,而不是更新并替换它们。
q = QueryDict('a=1', mutable=True)
q.update({'a': '2'})
q.getlist('a')
['1', '2']
q['a'] # returns the last
'2'
QueryDict.items()
类似dict.items()
,如果有重复项目,返回最近的一个,而不是都返回:
q = QueryDict('a=1&a=2&a=3')
q.items()
[('a', '3')]
QueryDict.values()
类似dict.values()
,但是只返回最近的值:
q = QueryDict('a=1&a=2&a=3')
q.values()
['3']
QueryDict.copy()[source]
使用copy.deepcopy()返回QueryDict对象的副本。 此副本是可变的。
QueryDict.getlist(key, default=None)
返回键对应的值列表。 如果该键不存在并且未提供默认值,则返回一个空列表。
QueryDict.setlist(key, list_)[source]
为list_
设置给定的键。
QueryDict.appendlist(key, item)[source]
将键追加到内部与键相关联的列表中。
QueryDict.setdefault(key, default=None)[source]
类似dict.setdefault(),为某个键设置默认值。
QueryDict.setlistdefault(key, default_list=None)[source]
类似setdefault(),除了它需要的是一个值的列表而不是单个值。
QueryDict.lists()
类似items(),只是它将其中的每个键的值作为列表放在一起。 像这样:
q = QueryDict('a=1&a=2&a=3')
q.lists()
[('a', ['1', '2', '3'])]
QueryDict.pop(key)[source]
返回给定键的值的列表,并从QueryDict中移除该键。 如果键不存在,将引发KeyError。 像这样:
q = QueryDict('a=1&a=2&a=3', mutable=True)
q.pop('a')
['1', '2', '3']
QueryDict.popitem()[source]
删除QueryDict任意一个键,并返回二值元组,包含键和键的所有值的列表。在一个空的字典上调用时将引发KeyError。 像这样:
q = QueryDict('a=1&a=2&a=3', mutable=True)
q.popitem()
('a', ['1', '2', '3'])
QueryDict.dict()
将QueryDict转换为Python的字典数据类型,并返回该字典。
如果出现重复的键,则将所有的值打包成一个列表,最为新字典中键的值。
q = QueryDict('a=1&a=3&a=5')
q.dict()
{'a': [1,3,5,]}
QueryDict.urlencode(safe=None)[source]
已url的编码格式返回数据字符串。 像这样:
q = QueryDict('a=2&b=3&b=5')
q.urlencode()
'a=2&b=3&b=5'
使用safe参数传递不需要编码的字符。 像这样:
q = QueryDict(mutable=True)
q['next'] = '/a&b/'
q.urlencode(safe='/')
'next=/a%26b/'
StreamingHttpResponse类
StreamingHttpResponse类被用来从Django响应一个流式对象到浏览器。如果生成的响应太长或者是占用的内存较大,这么做可能更有效率。 例如,它对于生成大型的CSV文件非常有用。
StreamingHttpResponse不是HttpResponse的衍生类(子类),因为它实现了完全不同的应用程序接口。但是,除了几个明显不同的地方,两者几乎完全相同。
`get_object_or_404()`
get_object_or_404(klass, *args,* *kwargs)[source]
常用于查询某个对象,找到了则进行下一步处理,如果未找到则给用户返回404页面。
在后台,Django其实是调用了模型管理器的get()方法,只会返回一个对象。不同的是,如果get()发生异常,会引发Http404异常,从而返回404页面,而不是模型的DoesNotExist异常。
必需参数:
klass
:要获取的对象的Model类名或者Queryset等;**kwargs
:查询的参数,格式应该可以被get()接受。
范例:
1.从MyModel中使用主键1来获取对象:
from django.shortcuts import get_object_or_404
def my_view(request):
my_object = get_object_or_404(MyModel, pk=1)
这个示例等同于:
from django.http import Http404
def my_view(request):
try:
my_object = MyModel.objects.get(pk=1)
except MyModel.DoesNotExist:
raise Http404("No MyModel matches the given query.")
2.除了传递Model名称,还可以传递一个QuerySet实例:
queryset = Book.objects.filter(title__startswith='M')
get_object_or_404(queryset, pk=1)
上面的示例不够简洁,因为它等同于:
get_object_or_404(Book, title__startswith='M', pk=1)
但是如果queryset来自其它地方,它就会很有用了。
3.还可以使用Manager。 如果你自定义了管理器,这将很有用:
get_object_or_404(Book.dahl_objects, title='Matilda')
4.还可以使用related managers:
author = Author.objects.get(name='Roald Dahl')
get_object_or_404(author.book_set, title='Matilda')
与get()一样,如果找到多个对象将引发一个MultipleObjectsReturned异常。
`get_list_or_404()`
get_list_or_404(klass, args, *kwargs)[source]
这其实就是get_object_or_404
多值获取版本。
在后台,返回一个给定模型管理器上filter()的结果,并将结果映射为一个列表,如果结果为空则弹出Http404异常。
必需参数:
- klass:获取该列表的一个Model、Manager或QuerySet实例。
**kwargs
:查询的参数,格式应该可以被filter()接受。
范例:
下面的示例从MyModel中获取所有发布出来的对象:
from django.shortcuts import get_list_or_404
def my_view(request):
my_objects = get_list_or_404(MyModel, published=True)
这个示例等同于:
from django.http import Http404
def my_view(request):
my_objects = list(MyModel.objects.filter(published=True))
if not my_objects:
raise Http404("No MyModel matches the given query.")