Django笔记
Django:
*各语言通用web架构MVC   
              Model(模型): 数据存储层, 管理数据的.
               View(视图): 表现层, 展示页面内容.
       Controller(控制器): 业务逻辑层, 中间调节人.
*Python的web架构MTV(各模块与MVC只是名字叫法不一样, 功能是一样的)
              Model(模型): 数据存储层.
		   Templete(模板): 表现层.
		       View(视图): 业务逻辑层.
*安装Django: pip install Django==1.11.4
*Django创建项目目录: 创建文件夹"Django项目" → 黑屏终端cd到该目录 → 输入命令django-admin startproject 名称
*查看目录层级:  tree . /F  
             manage.py: 一个命令行工具, 可以使我们用多种方式对Django项目进行交互.
		   project目录: __init__.py: 一个空文件, 它告诉python这个目录应该被看作一个python包.
		                settings.py: 项目的配置文件.
						    urls.py: 项目的URL声明.
							wsgi.py: 项目与WSGI兼容的web服务器入口.
					
*创建项目
       1.设计表结构
	        a.班级表结构
			     表名: grades
				 字段: 班级名称(gname),  女生总数(ggirlnum), 男生总数(gboynum), 是否删除(isDelete)
			b.学生表结构
			     表名: students
				 字段: 学生姓名(sname), 学生性别(sgender), 学生年龄(sage), 学生简介(scontent), 所属班级(sgrade), 是否删除(isDelete)
	   2.配置数据库
	        注意: Django默认使用SQLite数据库.
			如何配置: 在settings.py文件中, 通过DATABASES选项进行数据库配置.
			配置MySQL
			      python3.x安装的是PyMySQL
				  在__init__文件中写入两行代码, 不写会报错: import pymysql 和 pymysql.install_as_MySQLdb()
				  格式: DATABASES = {
				      'default': {
					      'ENGINE' : 'django.db.backends.mysql'
						    'NAME' : '数据库名'
							'USER' : '用户名'
					    'PASSWORD' : '数据库密码'
						    'HOST' : '数据库服务器ip'
							'PORT' : '端口',
						       	}
						}
	   3.创建应用
	        在一个项目中可以创建多个应用, 每个应用进行一种业务处理.
			打开黑屏终端进入"Django项目"目录下的project目录.
			执行命令 python manage.py startapp myApp.
			myApp目录说明
			      admin.py: 站点配置
				  model.py: 模型 
				      view: 视图 
	   4.激活应用
	        在settings.py文件中, 将myApp应用加入到INSATLLED_APPS选项中.
	   5.定义模型
	        概述: 有一个数据表, 就对应有一个模型.
			在models.py文件中定义模型: class Grades(models.Model)
			                           class Students(models.Model)
			说明: 不需要定义主键, 主键会在生成时自动添加, 并且值为自动增加.
	   6.在数据库中生成数据表
	        生成迁移文件并执行迁移: 黑屏终端cd到"Django项目"目录下的project目录,
			                        依次执行python manage.py migrate
								            python manage.py makemigrations myApp 
								            python manage.py sqlmigrate myApp 0001
								            python manage.py migrate
注意: 如果是要更改某个表的字段之类的, 最好就是直接把数据库的表和迁移文件都干掉重新来, 如果是要新增一个表, 那就直接再生成一份迁移文件就额可以了.
	   7.测试数据操作
	        黑屏终端cd到"Django项目"目录下的project目录, 执行命令 python manage.py shell
	        引入包: from myApp.models import Grades,Students
			查询所有数据: 类名.objects.all()
			添加数据
			    本质: 是创建一个模型类的实例对象
				添加一个班级
				>>>grade1 = Grades()
				>>>grade1.gname = "python04"
				>>>grade1.ggirlnum = 3
				>>>grade1.gboynum = 70
				>>>grade1.save()           # 保存提交到数据库, 创建或修改数据最后都要.save()提交到数据库.
				添加一个学生
				>>>stu1 = Students()
				>>>stu1.sname = "Alick"
				>>>stu1.sgender = True 
				>>>stu1.sage = 25
				>>>stu1.scontent = "我是Alick"
				>>>stu1.sgrade = grade1       # 外键关联
				>>>stu1.save()       
			查看具体某一个数据: >>>Grades.objects.get(pk=2)     # pk=2是主键为2的意思
			修改数据
       			>>>grade1.gboynum = 60
			    >>>grade1.save()
			删除数据(物理删除, 数据库中的表里的数据被删除了)
			    >>>grade1.delete()
	   8.关联对象
	        获得关联对象的集合: 对象名.关联的类名小写_set.all()
			                例: grade1.students_set.all()     # 获取python04班级所有的学生.
			需求: 创建学生"Tom"属于python04班级
			       ==> stu2 = grade1.students_set.create(sname="Tom", sgender=True, scontent="I'm Tom", sage=28)    # 这里是直接添加到数据库中了, 不需要save.
9.启动服务器
	        格式: python manage.py runserver ip:port
			注意: ip和port不写就是默认的本机ip和8000端口.
			说明: 这是一个纯python写的轻量级的web服务器, 仅仅在开发测试中使用.
	   10.Admin站点管理
	        概述: 内容发布(负责添加、修改和删除内容)和公告访问.
			配置Asmin应用: 在settings.py的INSTALLED_APPS中添加'django.contrib.admin', 默认是已经添加好的.
			创建管理员用户: 执行 python manage.py createsuperuser,  建立用户名密码邮箱.
			汉化: 修改settings.py文件, LANGUAGE_CODE = 'zh-Hans', TIME_ZONE = 'Asia/Shanghai'.
			管理数据表
			     修改admin.py文件
			          from .models import Grades,Students    # .models是代表当前目录下的models
					  # 注册
					  @admin.register(Grades)
					  class GradesAdmin(admin.ModelAdmin):
						  pass
					  @admin.register(Students)
					  class StudentsAdmin(admin.ModelAdmin):
					      pass
				 自定义管理页面
				      # 列表页属性
				      list_display: 显示字段
					   list_filter: 过滤字段
					 search_fields: 搜索字段
					 list_per_page: 分页
					  # 添加、修改页属性, 不写就是默认的.(fields、fieldsets二者只能用其一)
					        fields: 可以调整属性的先后顺序
					     fieldsets: 把属性分组展示
				 布尔值显示问题
				      def stu_gender(self):
						  if self.sgender:
							 return "男"
						  else:
						     return "女"
					  # 设置页面列的名称
					  stu_gender.short_description = "性别"
					  list_display = [stu_gender]
			     执行动作的位置
				      # 修改执行动作的位置(顶部或者底部)
					  actions_on_top = False
					  actions_on_bottom = True
11.视图的基本使用
	        概述: 在Django中, 视图对web请求进行回应, 视图就是一个python函数, 在views.py文件中定义.
			定义视图
          		 from django.http import HttpResponse
				 def index(request):
                     return HttpResponse("alick is a good man")
			配置url
			     修改project.py目录下的urls.py文件(include函数需要导入进来): url(r'^', include("myApp.urls"))
				 在myApp应用目录下创建一个urls.py文件
				      from django.conf.urls import url 
					  from . import views
					  urlpatterns = [
                              url(r'^$', views.index)
                             ]
       12.模板的基本使用
	        概述: 模板是html页面, 可以根据视图中传递过来的数据进行填充.
			创建目录模板: 创建templates目录, 在目录下创建对应项目的模板目录(project/templates/myApp)
			配置模板路径: 修改settings文件下的TEMPLATES:  'DIRS': [os.path.join(BASE_DIR, "templates")]
			创建并定义grades.html和students.html模板
			        模板语法1: {{ 输出值, 可以是变量, 也可以是对象.属性 }}
					模板语法2: {% 执行python代码段 %}
					模板语法3: {# 注释 #}
			http://127.0.0.1:8000/grades
			        写grades.html模板
					定义视图: def grades(request)
					 配置url: url(r'^grades/$', views.grades)
		    http://127.0.0.1:8000/students
			        写students.html模板
					定义视图: def students(request)
					 配置url: url(r'^students/$', views.students)  
			注意: 模板路径和url路径是两个不同的东西.
*ORM
     概述: 对象关系映射(object-relation-mapping)
     任务
         根据对象的类型生成表结构
         将对象、列表的操作转换为sql语句.
		 将sql语句查询到的结果转换为对象、列表.
     优点: 极大地减轻了开发人员的工作量, 不需要面对因数据库的变更而修改代码.
	   
	   
*模型 
    模型、属性、表、字段间的关系: 一个模型类在数据库中对应一张表,在模型类中定义的属性,对应该模型对照表中的字段.
	定义属性: 各种字段类型
	创建模型类
	元选项
	    在模型类里面再定义Meta类, 用于设置元信息
		     db_table: 定义数据表名, 若不定义数据表名, 则默认会使用"项目名小写_类名小写"来定义表名.
			 ordering: 对象的默认排序字段
			      ordering["id"]: 升序
				  ordering["-id"]: 降序
	模型成员
	    objects: 查询器, 是Manager类的一个对象, 作用是与数据库进行交互, 当定义模型类没有指定查询器, 则Django为模型创建一个名为objects的管理器.
		自定义管理器Manager类
              模型管理器: 是Django的模型与数据库进行交互的接口.
			  自定义的作用: 可以向管理器类中添加额外的方法
			  修改管理器返回的原始查询集, 重写get_queryset()方法.
		创建对象
		      目的: 向数据库中添加数据
			  本质: 当创建对象时, Django不会对数据库进行读写操作, 当调用save()方法时才与数据库交互, 将对象保存到数据库表中.
			  注意: __init__方法已经在父类models.Model中使用, 在自定义的模型中无法使用. 没有__init__方法的模型创建的对象是空对象, 所以用这种方式来创建对象不是很方便.
			  方法
			     1. 在模型类中增加一个类方法
				       class Students(models.Model):
					        @classmethod
							def create_student(cls, name, age, gender, contend, grade, isD=False):
							    stu = cls(sname=name, sage=age, sgender=gender, scontend=contend, sgrade=grade, isDelete=isD)
                                return stu
				 2. 在定义管理器中添加一个方法
	模型查询
        概述:  查询集表示从数据库获取的对象集合, 查询集可以有多个过滤器, 过滤器就是一个函数, 基于所给的参数限制查询集结果, 从sql角度来说, 查询集合select语句等价, 过滤器就像where条件.	
	    查询集
		     在管理器上调用过滤器方法返回查询集.
			 查询集经过过滤器筛选后返回新的查询集, 所以可以写成链式调用.
			 惰性查询: 创建查询集不会带来任何数据的访问, 直到调用数据时才会访问数据.
			 直接访问数据的情况: 迭代、序列化、与if合用.
			 返回查询集的方法称为过滤器
			         all(): 返回查询集中的所有数据
					 filter(): filter(键=值, 键=值)
					 exclude(): 过滤掉符合条件的数据
					 order_by(): 排序
					 values(): 一条数据就是一个对象(字典), 返回一个列表.
			 返回单个数据
			         get(): 返回一个满足条件的对象, 不符合会引发异常.
					 count(): 返回当前查询集中的对象个数
					 first(): 返回查询集中的第一个对象
					 last(): 返回查询集中的最后一个对象.
					 exists(): 判断查询集中是否有数据, 如果有数据则返回True.
		     限制查询集
			         查询集返回列表, 可以使用下标的方式进行限制(下标不能是负数), 等同于sql语句中的limit语句.
					 studentList = Students.objects.all()[0:5]
			 字段查询
			        概述:
					   概述: 实现了sql语句中的where语句, 作为方法filter()、exclude()、get()的参数.
					   语法: 属性名称__比较运算符 = 值  ,   外键是 属性名_id
					   转义: like语句中使用%是为了匹配占位, 匹配数据中的%(where like '\%'),  filter(sname_contains='%')
			 比较运算符
                   exact: 判断, 区分大小写, filter(isDelete=False)
				   contains: 是否包含, 区分大小写, student_list = Students.object.filter(sname__contains="孙")
				   startwith、endwith: 以values开头或结尾, 区分大小写, student_list = Students.object.filter(sname__startwith="孙")
				   以上四个在前面加上i就表示不区分大小写: iexact、icontains、istartwith、iendwith.
				   isnull/isnotnull: 是否为空, filter(sname__isnull=False)
				   in: 是否包含在范围内, student_list = Students.object.filter(id__in=[2,4,6,8,10])
				   gt/gte/lt/lte: 分别对应大于/大于等于/小于/小于等于, student_list = Students.object.filter(sage__gt=30)
				   year/month/day/week_day/hour/minute/second: student_list = Students.object.filter(lastTime__year=2017)
 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号