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的子类,它主要和父类的区别在于:

  1. 它的默认Content-Type被设置为:application/json
  2. 第一个参数,data应该是一个字典类型,第二个参数,关键字safe,当 safe 这个参数被设置为:False ,那data可以填入任何能被转换为JSON格式的对象,比如list, tuple等。默认的safe参数是 True. 如果你传入的data数据类型不是字典类型,那么它就会抛出 TypeError的异常。
response = JsonResponse([123], safe=False)
  1. json_dumps_params参数是一个字典,它将调用json.dumps()方法并将字典中的参数传入给该方法。

  2. 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.")
posted @ 2020-07-26 21:58  虫萧  阅读(295)  评论(0编辑  收藏  举报