Django

2018年7月2日 14:18

推荐博文:http://www.cnblogs.com/yuanchenqi/articles/6083427.html

1.安装Django

        pip install  django

    2.创建project

        django-admin starproject myset

    3.创建APP

        python manage.py starapp app01

    4.setting配置//jQuery

        TEMPLATES

        STAICFILES_DIR=(

            os.path.join(BASE_DIR,"statics"),

        )

        STATIC_URL = '/static/'

            url.py

            view.py

    5.使用模板

        render(request,"index.html")

    6.启动项目

        python manage.py runnserver 127.0.0.1:8090

    7.链接数据库

        model.py

    8.更新数据库

        Python manage.py makemigrations

        python manage.py migrate

    9.创建admin用户

        Python manage.py createsuperuser

    10.清空数据库

        python manage.py flush

    11.启动交互界面

        python manage.py  shell

    12.详细命令列表

        Python manage.py

MTV-templates:

    1.url(r'^index',view.index,name='rename') 建立别名,提高耦合,前后端分离

        eg:

      url(r'^index',view.StudentView.as_view(),name='student')#CBV

      url(r'^article/(?P\d{4})/(?P\d{2})$', views.year_month_hasname)#有名分组

        view:views.month_archive(request, year, month)

    2.include url

        eg:url(r'^myapp/',include('myapp.urls')),

    3.http请求中的两个核心对象:

        http请求:HttpRe

    4.locals():可以直接将函数中的所有变量传递给模板

        return render(request,"index.html",locals())

    5.request.FILE的三个属性:

        filename:上传的文件名

        content_type:上传文件的Content-type

        content: 上传文件的原始内容

    6.request.POST.getlist("hobby")

    7.request.path 只会拿到路径,不会拿到数据

    8.request.full_path 拿到全路径,包括数据

    9.反向生成URL

        django.core.urlresolvers.reverse()

        year = 2016

        url = reverse('rename',args=(year,))

        有名分组

        /index/(?P\d+)/     func    name=a3

        {% url "a2" nid=11 %}

        reverse('a3',kwargs={'nid':11})

       

    10.{% for item in person_list reversed %} 反向循环

    11.正则路由url(r'^(\w+)/(\w+)/$', views.display_table_objs,name="table_objs"),

        viewdef display_table_objs(request,app_name,table_name):

   

   -models:

    name = models.CharField(max_length=32,verbose_name='名称')

    city = models.CharField(verbose_name='城市',max_length=32)

    sex = models.BooleanField(max_length=1,choice=((0,''),(1,''),))

    website = models.URLField()

    email = models.EmailField()

    birthday = models.DateField()

    author = models.OneToOneField(Author)

    authors = models.ManyToManyField(Author)

    publisher = models.ForeignKey(Publisher)

    nid = models.AutoField(primary_key=True) 自定义自增列,默认会自动创建一个名为ID的自增列

    增:Book.objects.create(name = "ming")

        一对增加的两种方式:

            1. models.Book.objects.create(title="追风筝的人",publish_id=1) #publish_id=1

            2.pub_obj = models.Publish.objects.filter(name="人民出版社")[0]

              models.Book.objects.create(title = "简爱",publish=pub_obj) # publish=pub_obj

    删:Book.objects.fileter(id=1).delete()

        book = models.Book.objects.fileter(id=1)

        book.Author.clear() 清空与bookid=1关联的所有数据

        book.author.remove(2) 可以为id

        book.author.remove(*[1,3,5]) 可以是列表

        反向:

        auther = models.Author.objects.filter(id=1)

        auther.book_set.clear()

       

    改:

        models.Book.objects.filter(id=3).update(title='PHP') 效率高

        多对多:

        obj=Book.objects.filter(id=1)[0]

        auther=Author.objects.filter(id_gt=2)

        obj.auther.clear() #无返回值

        obj.auther.add(*auther)

        obj.auther.remove() #有返回值

    查:

    # 查询相关API

 

    # filter(**kwargs):      它包含了与所给筛选条件相匹配的对象

    # all():                 查询所有结果

    # get(**kwargs):         返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。

    #-----------下面的方法都是对查询的结果再进行处理:比如 objects.filter.values()--------

    # values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列 model的实例化对象,而是一个可迭代的字典序列                                    

    # exclude(**kwargs):     它包含了与所给筛选条件不匹配的对象

    # order_by(*field):      对查询结果排序

    # reverse():             对查询结果反向排序

    # distinct():            从返回结果中剔除重复纪录

    # values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列

    # count():              返回数据库中匹配查询(QuerySet)的对象数量。

    #first():               返回第一条记录

    #last():                返回最后一条记录

    # exists():             如果QuerySet包含数据,就返回True,否则返回False

    # 14.values value_list     的区别,前者返回字典,后者返回元组

        #values

        < QuerySet[(2, 'python'), (24, 'python')] > #values_list

    #15.update()                 只对queryset结果集有效,所以filter()update方法,get()没有update的方法

    #16.delete()                  删除                  

    #datalist = models.Userinfo.objects.all().only("name","email")  #拿到的还是一个QuerySet集合,仅仅取nameemail

    #datalist = models.Userinfo.objects.all().defer("name","email") #阻止,不取nameemail


   了不起的双下划线:

    .count()获取匹配的个数

    id__lt=10,id__gt=1 #获取id大于1且小于10

    id__in=[11,22,33] #获取id等于11,22,33的数据

    exclude(id__in=[11,22,33]) #获取id不等于11,22,33的数据

    name__contains='ven' #获取name中包含ven的数据

    name__icontains='ven' #获取name中不包含 ven的数据

    id__range=[1,2] 范围 1-2 含左不含右

    pub_data__isnull=True 是否可以为null

    .order_by('id') asc从大到小排序

    .order_by('-id') desc从小到大排序

    正则匹配 regexiregex不区分大小写

    Entry.objects.get(title__regex=r'^(An?|The) +')

    Entry.objects.fileter(pub_data__data=datetime.date(2018,1,1)) --->date

    Entry.objects.fileter(pub_date__year=2005) -->year

   

    聚合查询和分组查询:

    Book.objects.all().aggregate(Avg('price'))----->{'price__avg':34.35}

    Book.objects.aggregate(Avg('price'),Max('price'),Min('price'))

    --->{'price__avg': 34.35, 'price__max': Decimal('81.20'), 'price__min': Decimal('12.99')}

    分组:

    Book.objects.filter(auther__name='alex').values('title') 查询alex出的书

    Book.objects.fileter(auther__name='alex').aggregate(Sum('price')) alex出的书总价

   

    F查询和Q查询:

    from django.db.models import F

    from django.db.models import Q  导入

    F使用查询条件的值,对数值进行操作

        eg: models.Tb1.objects.update(num=F('num')+1)

    Q构建搜索条件:

        q1=models.Book.objects.filter(Q(title__starswith='P')).all()

        Q(title__starswith='P')|Q(title__starswith='J') 匹配P开头或者是J开头的title

        Q对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面

   

    JSONON:

        JSON.parse(str) ---> Object{"age":23,"name":"yuan"}   # 用于从一个json字符串中解析出jason对象

        var c={a:1,b:2}

        JSON.stringify(c)  -->'{"a":1,"b":2}' #用于从一个json对象解析成json字符串

    django js发送数据:

    def login(request):

    obj={'name':"alex111"}

    return render(request,'index.html',{"objs":json.dumps(obj)})

    #----------------------------------

Ajax - javascript:   

    post 请求需要设置请求头:xmlHttp.setRequestHeader(Content-Type, application/x-www-form-urlencoded)

    XMLHTTPRequest:

    1.open(请求方式,URL,是否异步)默认异步

    2.send(请求体)

    3.onreadystatechange,指定监听函数,它会在xmlHttp对象的状态发生变化是调用

    4.readyState, 当前xmlHttp对象的状态,其中4状态便是服务器响应结束

    5.status ,服务器响应的状态码,200表示响应成功

    6.responseText, 获取服务器的响应体

    eg:

1.function createXMLHTTPRequest() 
        2.function brul(){
            xmlHttp = createXMLHTTPRequest()
            xmlHttp.onreadystatechange = function(){
                if (xmlHttp.readyState ==4 && xmlHttp.status){
                    if (xmlHttp.responseText=="true"){
                        document.getElementById("hidden").innerText="你的用户已经存在"
                    }else{
                        document.getElementById("hidden").innerText=""
                    }
                }
            }
            xmlHttp.open("GET","/myapp/Ajax_test/",ture,"json")
            xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            var username = document.getElementById("hide").values
            xmlHttp.sent("username="+username)
            }

Ajax - jQuery:  

    1.$.get(url,[data],[callback],[type]) //q请求参数应该尽量放在data参数中,可以自动编码,避免手动拼接URL

    2.$.post(url,[data],[callback],[type]) //type:text|html|json|script

    $.post('myapp/student_manager/',{id:id},function(data){

        if(data == 'true'){

            document.getElementById("hidden").innerText="该用户名已经存在";

        }else{

            document.getElementById{"hidden"}.innerText="";

        }

    })

    $.ajax(function{

    })


django logging-setting配置

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }

信号:

    model_signals:

    pre_init                #model对象执行其构造方法前,自动触发

    post_init               #model对象执行其构造方法之后,自动触发

    pre_save                #model对象保存前,自动触发

    post_save               #model对象保存后,自动触发

    pre_delete              #model对象删除前,自动触发

    post_delere             #model对象删除后,自动触发

    m2m_changed             #model对象使用M2M字段操作数据库中的第三张表示,自动触发

   

    managemeng_signals:

    pre_migrate             #执行migrate命令前,自动触发

    post_migrate            #执行migrate命令后,自动触发

   

    request/response_signals:

    request_startes         #请求到来前,自动触发

    request_finished        #请求结束后,自动触发

    got_request_exception   #请求异常时,自动触发

   

    test_signals:

    setting_changed         #配置文件改变时,自动触发

    template_rendered       #模板执行渲染时,自动触发

   

    Datebase_Wrapperd       #创建数据库连接时,自动触发

1.在项目的 __init__.py 文件中:
from django.db.models.signals import pre_save,post_save
        def pre_save_func(sender,**kwargs):
            print("pre_save_func")
            print("pre_save_msg:",sender,kwargs)
        def post_save_func(sender,**kwargs):
            print("post_save_func")
            print("post_save_msg:",sender,kwargs)
        pre_save.connect(pre_save_func)           # models对象保存前触发callback函数
        post_save.connect(post_save_func)          # models对象保存后触发函数
2.使用装饰器触发函数:将__init__.py 中的代码修改为
@receiver(request_finished)
        def callback(sender, **kwargs):
            print("Request finished!")

评论

暂时还没有评论,欢迎评论!