Django 基础

Django是一个流行的高级Python Web框架,它旨在简化快速开发动态网站和Web应用的过程。Django的核心理念是“约定优于配置”,这意味着它提供了一系列强大的内置功能,如ORM(Object-Relational Mapping),自动管理后台系统、表单处理、URL路由等。

Django的主要特性包括:

  • MVC设计模式:模型(Model)、视图(View)和模板(Template)三者的分层结构,使得开发人员可以专注于各自的职责。
  • ORM:通过数据库操作模型对象而非SQL语句,提高开发效率并降低出错可能性。
  • DRF(Django Rest Framework):用于构建RESTful API的模块,简化API的设计和开发。
  • Admin站点:内置的用户界面管理系统,方便快速添加、编辑和查看内容。
  • URL路由:简单易用的URL配置,支持正则表达式匹配和命名路径。
  • 模板语言:基于HTML的简单易学的模板语法,支持条件语句、循环等。

1.Django模版语言

Django HTML模板语言是一种轻量级、高度模板化的系统,它允许开发者在HTML文件中嵌入Python表达式,结合Django框架动态生成内容。以下是Django模板语言的一些关键特性:

  1. 变量绑定:使用`{{ variable_name }}`语法显示模型数据,Django会自动处理变量的安全性和数据类型转换。
  2. 条件语句:`{% if condition %}`用于控制结构,如果条件成立则展示内容;还有`{% else %}`和`{% elif %}`用于多条件判断。
  3. 循环遍历:`for item in list:`可以迭代一个列表或其他序列,并用`item`替换为每次迭代的值,如`{{ forloop.counter }}`用于访问当前迭代次数等。
  4. 标签(Filters):`| filter_name`用于对变量应用内置过滤器,例如日期格式化、字符串截取等。
  5. 模板继承:通过`extends`关键字定义基础模板,子模板可以在其中覆盖或添加内容,减少重复代码。
  6. 模板片段(Template Tags):自定义功能强大的标签,类似于HTML的自定义元素,提供更高级的功能。
  7. 模板命名空间:`{% load namespace %}`可以组织相关的模板组件,保持代码整洁。
# =====HTML文件声明使用模版语音

{% load static %}

# =====变量:在模板中使用 {{ variable }} 来表示变量,例如:

<p>{{ my_variable }}</p>

# =====标签:使用 {% tag %} 来执行逻辑,例如循环:

{% for item in items %}
  <p>{{ item }}</p>
{% endfor %}

# =====过滤器:使用 | 管道符应用过滤器来改变变量的显示,例如:

<p>{{ my_variable|upper }}</p>

# =====模板继承:使用 {% extends %} 和 {% block %} 标签实现模板继承:

{% extends "base.html" %}
{% block content %}
  <p>This is the content of the page.</p>
{% endblock %}

# =====静态文件:使用 {% static %} 标签来引入静态文件:

<img src="{% static 'images/logo.png' %}" alt="Logo">

2.URL传值

# 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/<int:num_id>/',app01views.index_num),
    path('num/detail/',app01views.index_detail),
    # 正则化规范URL 0-9 6位输入 (?P<num_id>[0-9]{6})
    # 95开头的六位数字 (?P<num_id>[9][5]\d{4})
    re_path('renum/(?P<num_id>[0-9]{6})/(?P<type>[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)]))

 3.ORM常用字段及参数

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()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值