Django是一个流行的高级Python Web框架,它旨在简化快速开发动态网站和Web应用的过程。Django的核心理念是“约定优于配置”,这意味着它提供了一系列强大的内置功能,如ORM(Object-Relational Mapping),自动管理后台系统、表单处理、URL路由等。
Django的主要特性包括:
Django HTML模板语言是一种轻量级、高度模板化的系统,它允许开发者在HTML文件中嵌入Python表达式,结合Django框架动态生成内容。以下是Django模板语言的一些关键特性:
# =====HTML文件声明使用模版语音 {% load static %} # =====变量:在模板中使用 {{ variable }} 来表示变量,例如: {{ my_variable }}
# =====标签:使用 {% tag %} 来执行逻辑,例如循环: {% for item in items %} {{ item }}
{% endfor %} # =====过滤器:使用 | 管道符应用过滤器来改变变量的显示,例如: {{ my_variable|upper }}
# =====模板继承:使用 {% extends %} 和 {% block %} 标签实现模板继承: {% extends "base.html" %} {% block content %} This is the content of the page.
{% endblock %} # =====静态文件:使用 {% static %} 标签来引入静态文件:
# urls.py路由定义 from django.contrib import admin from django.urls import path from app01 views as app01views # URL 正则化输入 from django.urls import re_path from app02 import views as app02views # 调用其他app下定义的 url from django.urls import include urlpatterns = [ path('admin/', admin.site.urls), path('',app01views.index), # 定义只能接收int型输入 path('num//',app01views.index_num), path('num/detail/',app01views.index_detail), # 正则化规范URL 0-9 6位输入 (?P[0-9]{6}) # 95开头的六位数字 (?P[9][5]\d{4}) re_path('renum/(?P[0-9]{6})/(?P[0-4])',app01views.re_path), path('index/',app02views.index), path('rander_index/',app02views.rander_index), path('read_csv/',app02views.handle_csv), # 中转处理url 为空时访问路径直接是 home/urls 定义的路径,不为空则访问的是拼接起来的路径/home/home path('home/',include('home.urls')), path('mysql/',include('mysqlconnect.urls')) ]
# views.py 定义 from django.shortcuts import render from django.http import HttpResponse # Create your views here. def index(request): return HttpResponse("首页") # URL 传值 def index_num(request,num_id): return HttpResponse('接受的ID为:%s URL输入'% num_id) # URL 查询字符串传值 def index_detail(request): # http://192.168.20.110/num/detail/?num=12346 # 对标 ?和 = 之间的字符串 num_id = request.GET.get('num') # 传递多个值 用 & 隔开 # http://192.168.20.110/num/detail/?num=12346&city=shanghai city = request.GET.get('city') return HttpResponse('接受的ID为:%s URL输入,坐标:%s' % (num_id,city)) # 正则化规范URL def re_path(request,num_id,type): type_num = ['上海','北京','广州','深圳'] return HttpResponse('接受的正则化ID为:%s URL输入 \n 城市:%s' % (num_id,type_num[int(type)]))
python manage.py migrate --fake(对已存在的表进行数据同步) ********************查询操作的返回值********************** all()--- 所有 filter() --- 满足条件的所有 exclude()---排除对象 order_by()--- 排序 reverse()-- 反序 distinct()-- 去重 values(): 返回一个可迭代的字典序列 values list():返回一个可迭代的元祖序列 get()满足条件的第一个对象 first()整个集合的第一个对象 last()整个集合的最后一个对象 exists() --- 是否存在满足条件的对象 false/true Count()--- 返回结果集的数量 results = models.student.objects.all()#返回所有对象 results = models.student.objects.filter(gender='男')# 返回所有满足条件的对象 results = models.Student.objects.exclude(sname='Bob')#排除Bob results = models.student.objects.all().order_by('-sage')# 排序 results = models.student.objects.all().order by('-sage').reverse()#反序 results = models.Student.objects.get(sname='Alice') results = models.student.objects.first() results = models.student.objects.last() result = models.student.objects.filter(sname='张=').exists() result = models.Student.objects.filter(gender='男').count() results = models.Borrowbook.objects.all().values("sno_id").distinct() #去除指定列重复值 ********************查询基本条件********************** 1.获取所有数据 results = models.Student.objects.all().values() 2.判断相等 results = models.Student.objects.filter(gender='男’)results = models.Student.objects.filter(gender exact='男’)results = models.Student.objects.filter(sage exact=None) 3.大于小于年龄大于等于25岁 results = models.Student.objects.filter(sage gte=25)# 年龄小于等于25岁 results = models.Student.objects.filter(sage ite=25) 4.in--- 在某一个list范围内 # 查询出姓名登录Alice,bob results = models.Student.objects.filter(sname in =['Alice','Bob']) 5.range--某一个范围 ,相当于SQL中的Between --- and --- results = models.Student.objects.filter(sage range =(25,30)) 5.判断是空 --isnull results = models.Student.objects.filter(sage isnull=True) ==============练习================= 查询出姓名为“陈鹏”的学号、手机号码和邮箱地址 results = models.Student.objects.filter(sname='陈鹏') results=models.Student.objects.filter(sage exact='陈') results = models.Student.objects.filter(sage in=['陈鹏']) 查询出姓名不是“陈鹏”的学生的所有信息 results=models.Student.objects.exclude(sname exact='陈鹏') 查询出大于25的女生的学生信息 results = models.Student.objects.filter(sage gte=25, gender exact='女') 查询出学生年龄介于20到30间的学生学号和姓名 results = models.Student.objects.filter(sage range=(20,30)) 查询哪些学生没有填写“年龄”信息 results = models.Student.objects.filter(sage exact=None) results = models.Student.objects.filter(sage isnull=True) 查询出“陈鹏”,”Alice”,”Bob”的学号,年龄 results = models.Student.objects.filter(sname in=['Alice','Bob','陈鹏”]) ********************ORM模糊查询********************** 1.模糊查询 ---startswith,endswith,contains 查询出以134开头的手机号码 students = models.Student.objects.filter(stumobile startswith='134').values() 查询出以8开头的手机号码 students = models.Student.objects.filter(stumobile endswith='5').values() 查询手机号码中包含88 students = models.Student.objects.filter(stumobile contains='88').values() ==============练习================= 查询出所有姓“陈”的学生 students = models.Student.objects.filter(sname startswith='陈’).values() 查询出手机号码134或者135开头,倒数第四位为不是7也不是8的学生姓名 students = models.Student.objects.filter(stumobile regex=r'^[1][3][45][0-9]{4}[^78][0-9]{3}$' ).values 查询出借过书的同学的学号 results = models.Borrowbook.objects.all().values("sno__id").distinct() 对Student表按照年龄升序排序,如果年龄一样,女生排在男生前面 results = models.Student.objects.all().order by('sage','gender').values() 查询出Student表中的前5行记录 results = models.Student.objects.all()[0:5].values() ********************ORM聚合函数********************** COUNT:求所选记录行数 AVG:求所选记录的平均值 SUM:为所选记录求和 MAX:求所选记录的最大值 MIN:求所选记录的最小值 导入模块:from django.db.models import Count, Max, Min, Sum, Avg 方法:Book.objects.aggregate() ==============练习================= 1.统计出学生最大年龄,最小年龄 results = models.Student.objects.aggregate(max age = Max('sage’), min_age = Min('sage') 2.查询出男生的平均年龄 results = models.Student.objects.filter(gender exact='男’).aggregate(avg=Avg('sage”)) 3.查询出有多少位学生借书 results = models.Borrowbook.objects.aggregate(number = Count('sno',distinct=True)) 4.查询出计算机类的图书总共有多少本 results = models.Book.objectsfiter(booktype_exact=1).aggregate(sum_num = Sum('booksumno’) ********************ORM分组查询********************** 方法:Book.objects.annotate() ==============练习================= 统计出男女生的人数 results = models.Student.objects.values('gender'").annotate(number=Count('gender') # 统计出每一类书中的最高的价格results = models.Book.objects.values('booktype').annotate(maxprice=Max('bookprice’) 统计出每一类书中的最高的价格大于等于45元 results = models.Book.objects.values('booktype’).annotate(maxprice=Max('bookprice').filter(maxprice gte=45.0) 查询出借的超过两本的书的ID号及数量 results = models.Borrowbook.objects.values('bookid').annotate(number=Count('id').filter(number gt=2) 统计出借书多于两本的学生学号以及数量,按照数量的降序排列 results = models,Borrowbook.objects.values('sno’.annotate(number=Count!'id").filter(number gt=2).order by-number') ********************ORM F表达式 对两个字段的值做比较********************** 统计出男女生的人数 results = models.Borrowbook.objects.filter(borrowdate gt = F('returndate')).values() bookprice价格都加1 models.Book.objects.update(bookprice = F('bookprice')+ 1.0) 导入:from django.db.models import F,Q ********************ORM Q表达式********************** filter() 等方法中的关键字参数查询都是一起进行“AND” ,如果希望两个条件是“OR”的关系,需要用到Q 表达式 统计出男生等于25岁人数 results = models.student.objects.filter(k(gender_exact='男')| Q(sage_gte=25)) ********************ORM 连接查询********************** 由一查多:给定的条件在主键表中,要査询的内容在外键表中 ---正向查询 记住字段名 #比如查询:李明志写了哪些书? 多类名.objects.filter(关联属性__类属性名=县体条件) results = models.Book.objects.filter(bookauthor__authorname_exact='李明志').values() 由多查一:给定的条件在外键表中,要査询的内容在主键表中 ---反向查询 记住表名 一类名.objects.filter(多类名小写__多类属性名=具体条件) results = models.Press.objects.filter(book__bookid_exact=95006) ==============练习================= 查询出陈鹏所借的图书id 关系:1对多 有一查多 Student:BorrowBookresults = models.Borrowbook.objects.filter(sno_sname_exact='陈鹏').values() 95005的书被哪些同学借 由BorrowBook去查Student关系:多查 results = models.student.objects.filter(borrowbook bookid exact=39005).values() ********************ORM 多表连接查询********************** 查询出陈鹏所借的图书的作者 results = models.Author.objects.filter(book__borrowbook__sno__sname='陈鹏').distinct().values()