Django框架遗漏的部分

orm相关

过滤API

与values_list和values不同的是,only只对选定字段进行查询,返回结果是一个模型类对象,但是这个对象依然可以去查询没有指定的的字段,但是会再次去查询数据库.

与only相反的是defer,排除指定字段

响应

JsonResponse

JsonResponse内部帮我们做了序列化,但是如果safe参数设置为True,而数据并非一个字典的话就会抛出异常

class JsonResponse(HttpResponse):

    def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,
                 json_dumps_params=None, **kwargs):
        if safe and not isinstance(data, dict):
            raise TypeError(
                'In order to allow non-dict objects to be serialized set the '
                'safe parameter to False.'
            )
        if json_dumps_params is None:
            json_dumps_params = {}
        kwargs.setdefault('content_type', 'application/json')
        data = json.dumps(data, cls=encoder, **json_dumps_params)
        super(JsonResponse, self).__init__(content=data, **kwargs)

多库操作

PASS

模板中生成器的问题

函数中的双层yield

def yieldi():
    a = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
    for i in a:
        print("外部循环")
        def inner():
            print(i)
            for j in i:
                print("内部循环")
                yield j
        yield inner()


f = yieldi()
for i in f:
    for j in i:
        print(j)

模板中:

他会先执行全部的外部循环,在执行内部循环,内部打印的值都是a中最后一个值的内容,如果想像函数中一样需要显式的将a传递给inner()

from django.conf.urls import url
from django.shortcuts import HttpResponse,render,redirect
def yieldi():
    a = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
    for i in a:
        print("外部循环")
        def inner():
            print(i)
            for j in i:
                print("内部循环")
                yield j
        yield inner()  

def foring(reqyest):
    f=yieldi()
    return render(reqyest,"yieldi.html",locals())

urlpatterns = [
    url(r'^aaa/', foring),
]

# 模板内容
{% for i in f %}
    <p>{{ i }}</p>
    {% for j in i %}
        {{ j }}
{% endfor %}
{% endfor %}

QueryDict

from django.http import QueryDict

reuqest.GET和POST的数据类型,该数据类型继承了字典,默认不可以被修改.如果我们想要修改其中数据,建议是将其进行深拷贝,然后将其_mutable 属性设置为True,就可以对新的QueryDict进行修改

其设置属性同字典

def get_tag(request):
    params = request.GET
    print(type(params))
    import copy
    params = copy.deepcopy(params)
    params._mutable = True 
    params['name] = ''
    return HttpResponse('OK')

由QueryDict生成URL后的条件

QueryDictObj.urlencode()

  

posted @ 2018-04-16 16:02  瓜田月夜  阅读(87)  评论(0)    收藏  举报