他是一个基于python语言的WEB框架
为何使用Djangocss
Django的优点html
经过wsgi模块理解Django的工做集成原理前端
wsgi是一种规范,wsgiref是基于wsgi规范开发的模块python
django-admin.py startproject my_site 建立my_site项目mysql
第一次django请求web
启动django web服务器 python3 manage.py runserver 0.0.0.0:8000ajax
retrun HttpResponse方法返回咱们定义的数据正则表达式
Django是一个MTV框架,其框架模板上看起来和传统的MVC架构没有什么太大的区别.sql
Django将MVC中的视图进一步分解为Django视图和Django模板两个部分shell
- Django中的html文件就是模板 视图就是views.py
T 就是Templates 数据展现
在Django的MTV框架中MVC C控制器部分由Django框架的urlconf来实现代替
严格来讲Django是MVTC C被实现替代了
urls.py文件中 re_path是使用正则匹配用户请求的url 主要配合动态路由
Django路由的匹配心法
Django 在2.0以后使用了新的语法path,不使用re_path
path('articles/<int:arg1>/<month:arg2>/<int:arg3>', views.kw)
str 字符串 除了/ 以外的任何字符串都能匹配
int 匹配任意数字
slug 匹配任意的**-**-**
uuid 匹配uuid格式的,特定场景下才会使用的到
path / + str 能够匹配到/
使用include管理app下的url
在顶级的urls.py文件中导入from django.urls import include
path('app01/',include('app01.urls')),
Django的模型(admin文件的操做)
ORM是什么?
ORM的做用
ORM映射字段的语法
AutoField (设置自增)
BigAutoField (设置更大的自增)
BigIntegerField (更大的整数)
BinaryField (二进制的数据)
BooleanField (布尔类型的数据)
CharField (字符串类型的数据)
DateField (年与日时间类型)
DataTimeField(精确到时分秒的时间类型)
DecimalField ()
DurationField()
EmailField(邮箱类型)
FileField(存储文件的类型)
FloatField(浮点数类型)
ImageField(图片类型)
IntegerField(整数类型)
GenericIPAddressField(ipv4地址类型)
NullBooleanField (容许boolean类型为空)
TextField(大的文本)
ForeignKey(外键关联)
ManyToManyField(多对多)
OneToOneField(1对1)
将models文件中的类同步到mysql数据库中(必需要注意models文件中的外键和多对多要一一对应)
在Django官网找到数据库的配置https://docs.djangoproject.com/en/3.0/ref/settings/#databases 写到settings文件当中
在项目下的init.py文件中写入
import pymysql pymysql.version_info = (1, 3, 13,"final",0) pymysql.install_as_MySQLdb()
建立数据库mysql> create database blogdatabase charset utf8;
在settings文件中设置INSTALLED_APPS 加上app的名字
使用Django数据库的同步工具migrations
使用ORM映射插入数据 首先 python manage.py shell
普通建立
>>> models.Account.objects.create( >>> ... username = 'jeke', >>> ... email = '123@163.com', >>> ... password = '123', >>> ... )
外键关联建立
>>> o = models.Article( >>> ... title = '我是Peter', >>> ... content = 'xixi', >>> ... pub_data = '2020-6-11') >>> o >>> <Article: Article object (None)> >>> o.account_id = 1 > >>> o.save()
多对多的建立数据
ORM对数据进行查询(后来找到的查询语法https://www.cnblogs.com/ls1997/p/10955402.html)
models.Account.objects.all() ==> select *
models.Account.objects.filter(id=1) ==> select * where id=1
models.Account.objects.filter(id__gt=1) ==> where id > 1
models.Account.objects.filter(id__gt=1,password='111') ==> where id >1 and password ='111';
models.Account.objects.filter(password__startswith=1) ==> where password like '1%'
models.Account.objects.filter(username__contains='zj') ==> 只要username包含大小写的zj
models.Account.objects.filter(username__icontains='zj') ==> 只能匹配到小写的zj
models.Account.objects.filter(id__in=[1,2]) ==> where id in (1,2)
models.Account.objects.filter(username__endswith='j') ==> where username like '%j'
日期的待补充
filter正则表达式
上边拿到的都是queryset的对象,不是数据,想要拿到数据可使用不少方法
>>> a = models.Account.objects.filter(username__regex=r'(zj|j)$') >>> b = a.values() >>> b.values('id').order_by('id') #升序 <QuerySet [{'id': 2}, {'id': 3}]> >>> b.values('id').order_by('-id') <QuerySet [{'id': 3}, {'id': 2}]> #降序 >>> *想要用reverse 必需要用先order_by排序* >>> b.values('id').order_by('-id').reverse() #翻转 <QuerySet [{'id': 2}, {'id': 3}]> >>> b.values('id').order_by('id').reverse().first() #取最后一个值,先翻转在取第一个 {'id': 3}
a = models.Account.objects.get(id=1) 精确查询某一字段 #返回的是真实的对象了,不是queryset对象了
直接调用a.id a.username 便可
models.Account.objects.exclude(id=1)
<QuerySet [<Account: Account object (2)>, <Account: Account object (3)>]>
get 返回一个对象,没有或者多个会报错,不经常使用可是要不filter查询速率快
filter 返回多个对象
all 返回全部数据
exclude 排除符合匹配条件的数据,返回其余的数据
>>> models.Account.objects.exclude(id=1).update(password='1234656') #批量修改只要是id不等于1的密码都改为123456
>>> a = models.Account.objects.get(id=1) >>> a.password = '123456789' >>> a.save()
>>> models.Account.objects.get(password='123456').delete()
>>> a = models.Account.objects.get(id=1) >>> a.delete()
外键关联操做(模块建立)
正向外键关联(在有关联字段的表中查询)
>>> a = models.Article.objects.create(title = 'hahahaha322332', content = '阿光高你刚42151啊方法',account_id = 8 ,pub_data = '2020-06-12') >>> a.account.id # a 定义的是Article的数据,可是能够经过外键关联到Account 查询到Account的数据
反向外键关联(无关联字段的表中查询, ORM会自动的帮助咱们建立一个表)
>>> obj = models.Account.objects.all()[0] >>> obj.article_set.all() <QuerySet [<Article: Article object (6)>]> >>> obj.article_set.all().values() <QuerySet [{'id': 6, 'title': 'hahahaha', 'content': '阿光高你刚啊方法', 'account_id': 4, 'pub_data': datetime.date(2020, 6, 12)}]>
多对多关联
>>> a.tags.all() >>> t = models.tag.objects.all()[1] >>> t.article_set.all()
admin 是Django自带的让你用来进行数据库管理的web app
提供了不少定制化的功能,你甚至能够用它来进行公司内部的内容管理
首先建立登陆的用户 >> python3 manage.py createsuperuser
若是app01想要被管理的话,必须受权容许管理admin.py文件写入下面的内容
from django.contrib import admin from app01 import models # Register your models here. admin.site.register(models.Account) admin.site.register(models.Article) admin.site.register(models.Tag)
开启Django >> python3 manage.py runserver 0.0.0.0:8000
打开localhost:8000/admin 就能够看到对应的数据库进行操做了
from django.contrib import admin from app01 import models class AccountAdmin(admin.ModelAdmin): list_display = ('username', 'email', 'signature') # 显示这三个字段 search_fields = ('username', 'email','signature') # 加入搜索按钮 list_filter = ('email', ) # 过滤, 针对重复的字段过滤 list_per_page = 2 # 设置分页 # list_display_links = ('email',) class ArticleAdmin(admin.ModelAdmin): list_display = ('title', 'content', 'account', 'pub_data') list_filter = ('account', 'pub_data') search_fielshituds = ('title',) fields = ('title', 'content', ('pub_data', 'account', 'tags')) # 设置admin修改建立页面可修改的数据 exclude = ('account',) # 排除不显示一些字段 date_hierarchy = 'pub_data' # 按照时间的分组(只能用时间) fieldsets = ( ('文章基本信息', { 'fields': ['title', 'content'], }, ), ('高级选项', { 'fields': ['account', 'tags', 'pub_data'], 'classes': ('collapse',), # 让这个高级选项变成有收缩折叠功能 } ) ) filter_horizontal = ('tags',) # 只能针对多对多 filter_vertical = ('tags',) radio_fields = {'account': admin.VERTICAL} # 将下拉框变成按钮以供选择 autocomplete_fields = ['account',] readonly_fields = ('title',) # 设置只读字段 admin.site.register(models.Account,AccountAdmin) admin.site.register(models.Article,ArticleAdmin) admin.site.register(models.Tag)
自定义Admin字段
在models文件中写入
def get_comment(self): return 10
再在admin对应的库中加上list_display = ('get_comment',) 字段
自定义字段名 在,models中修改
signature = models.CharField("签名", max_length=255, null=True) # null容许值为空,签名
自定义表名 在models文件中类中加入
class Meta: # verbose_name = "用户列表" # 针对英文的 verbose_name_plural = '用户列表' # 针对中文的
视图中的字段抛开讲解
HttpRequest对象属性
除了属性HttpRequest的方法
Httpresponse(content_type格式参考手册https://www.w3school.com.cn/media/media_mimeref.asp)
设置下载文件的方法
def download(request): f = open("static_data/15s第三方软件设备适配状况.xlsx", 'rb') res = HttpResponse(f.read(),content_type='application/vnd.ms-excel') # 设置返回的内容格式为excel文档格式 res['Content-Disposition'] = 'attachment; filename ="15s.xlsx"' # 设置用户请求的时候下载下来的是一个attachement附件和文件名 return res
设置重定向
def redirect(request): return HttpResponseRedirect("/app01/download")
CBV(class base view) 类视图
from django.views import view class TestView(View): def get(self,request): return HttpResponse("测试get请求自动的使用这个get()函数") def post(self,request): return HttpResponse("测试post")
在url 定义的时候加入as.view()方法
path('class_view',view.TestView.as_view())