Day01
Django目录介绍
- manage.py:是Django用于管理本项目的命令行工具,之后进行站点运行,数据库自动生成等都是通过manage.py完成。
- 项目名/init.py 告诉python该目录是一个python包,暂无内容,后期一些工具的初始化可能会用到
- import pymysql
- pymysql.install_as_MySQLdb()
- 项目名/settings.py Django项目的配置文件,默认状态其中定义了本项目引用的组件,项目名,数据库,静态资源等
- 项目名/urls.py维护项目的URL路由映射,即定义当客户端访问时由哪个模考进行响应
- 项目名/wsgi.py定义SWGI的接口信息,主要用于服务器集成,通常本文件生成后无需改动
项目目录介绍
- migrations包:自动生成,生辰迁移文件的
- _init_ .py:其中暂无内容, 使得app成为一个包
- admin.py:管理站点模型的声明文件,默认为空
- apps.py:应用信息定 义文件,在其中生成了AppConfig,该类用于I定义应用名等数据
- models.py:添加模型层 数据类文件
- tests.py:测试代码文件
- views.py:定义URL相应函数(路由规则)
基本视图
首先我们在views.py中建立一个路 由响应函数
from django.http import HttpResponse
def welcome(request):
return HttpResponse(HelloDjango);
接着我们在urls中进行注册
from App import views
path('welcome/', views.welcome)
基于模块化的设计,我们通常会在每个app中定义自己的urls
在项目的urls中将app的urls包含进来
from django.urls import path, include
path('app/', include('App.urls')),
基本模板
-
模板实际上就是我们用HTML写好的页面
-
创建模板文件夹,两种,
- 在工程目录的需要注册settings中的TEMPLATES中的DIRS中添加
os.path.join(BASE_ DIR,‘templates’)
如果是直接用pycharm创建, settings中TEMPLATES自动配置'DIRS': [BASE_DIR / 'templates']
- 在模板文件夹中创建模板文件
-
在views中去加载渲染模板
方法1from django.template import loader def welcome(request): template = loader.get_template('xxx') retuen HttpResponse(template.render())
方法2
return render(request,'xxx.html')
定义模型(表)
定义年级
class Grade ( models.Model) :
gname = models.CharField(max_ length=10)gdate = models.Date TimeField()
ggirlnum = models.IntegerField()
gboynum = models.IntegerField()
isDelete = models. .BooleanField()
定义学生
class Students(models.Model):
sname = models.CharField(max_ length=20)
sgender = models.BooleanField(default=True)
sage = models.IntegerField()
sinfo = models.CharField(max_ length=20)
isDelete = models. BooleanField(default=False) # 关联外键
sgrade = models .ForeignKey(Grade, on_delete=models.DO_NOTHING)
# ForeignKey(Grade, on_delete=models.CASCADE) CASCADE一起删除
实现一个请求
注册一个路由
1.urls.py中 urlpatterns=[]中添加path(参数1,参数2)
2.path参数1 匹配路径
3.path参数2 对应的是views中的一个函数,没有括号
去views实现对应的视图函数
1.第一个参数是request
2.永远记得返回Response
模板配置
- 方法1:在App中进行模板配置
- 只需在App的根目录创建templates文件夹即可
- 如果想让代码自动提示,应该标记为模板文件夹
- 方法2:在项目目录中进行模板配置
- 需要在项目目录中创建templates文件夹并标记
- 需要在settings.py中进行注册
- 在开发中使用第二种,模板可以继承、复用
路由优化配置
- 项目如果逻辑过于复杂,可以进行拆分
- 拆分为多个App
- 继续拆分路由器urls
- 在App中创建自己的urls
- urlpatterns 路由规则列表
- 在根urls中进行子路由的包含
- 子路由的使用(路径)
- 根路由规则+子路由的规则
- 在App中创建自己的urls
models 使用了ORM技术
- Object Relational Mapping 对象关系映射
- 将业务逻辑进行了一个解耦合
- object.save()
- object.delete()
- 关系型数据库
- DDL
- 通过models.py定义实现 数据库表的定义
- 数据操作–增删改查
- 存储
- save()
- 查询
- 查所有 object.all()
- 查单个 object.get(pk=xx)
- 更新
- 基于查询
- 查好的对象,修改属性,然后save()
- 删除
- 基于查询
- 调用delete()
- 存储
连接mysql驱动
- mysqlclient
- python2,3都能直接使用
- 缺点:对MySQL安装有要求,必须指定位置存在配置文件
- python-mysql
- python2 支持
- python3 不支持
- pymysql
- python2,3都支持
- 还可以伪装成前面的库
django shell
- 集成了python环境的shell终端
- 通常在终端中做一些调试工作
- 和ipython很像>_<?
如何看待bug
- 看日志
- 先看第一条
- 再看最后一条
- 梳理思路
- 程序在哪一个位置和预期出现偏差
表关系
下面不懂看这里:表关系详情
- 1:1
- 查询任我行的手机号。
- 正向:属性名称__跨表的属性名称(au_detail__tel) 跨表获取数据。
models.Author.objects.filter(name=“任我行”).values_list(“au_detail__tel”)
从作者表出发,得到电话,正向(一个作者只有一个电话) - 反向:小写类名__跨表的属性名称(author__name) 跨表获取数据。
models.AuthorDetail.objects.filter(author__name=“任我行”).values_list(“tel”)
从详细表出发,得到电话,反向(可能有多个叫任我行的,电话全展示)
- 正向:属性名称__跨表的属性名称(au_detail__tel) 跨表获取数据。
- 查询任我行的手机号。
- 1:M
- 书籍和出版社,一个出版社很多书,一本书只属于一个出版社
- 正向查询: 书.出版社 1:1
- 反向查询: 出版社.书_set 1:M
- 查询菜鸟出版社出版过的所有书籍的名字与价格。
- 正向:属性名称__跨表的属性名称
models.Book.objects.filter(publish__name=“菜鸟出版社”).values_list(“title”, “price”)
从书出发得到书,正向 - 反向:小写类名__跨表的属性名称
models.Publish.objects.filter(name=“菜鸟出版社”).values_list(“book__title”,“book__price”)
从出版社出发得到书,反向(一个出版社可能有很多书)
- 正向:属性名称__跨表的属性名称
- 书籍和出版社,一个出版社很多书,一本书只属于一个出版社
- M:M
- 查询任我行出过的所有书籍的名字。
- 正向:属性名称__跨表的属性名称(authors__name) 跨表获取数据:
models.Book.objects.filter(authors__name=“任我行”).values_list(“title”)
从书出发得到书,正向 - 反向:小写类名__跨表的属性名称(book__title) 跨表获取数据:
models.Author.objects.filter(name=“任我行”).values_list(“book__title”)
从作者名出发得到书,反向(一个作者可能有很多书)
- 正向:属性名称__跨表的属性名称(authors__name) 跨表获取数据:
- 查询任我行出过的所有书籍的名字。