django框架基础详解 (一)

django框架(一)
一、基本信息及demo
1、虚拟环境下 安装django
pip install django==1.11.16

2.检查django是否安装成功
     1. pip list
     2.进入交互模型
	  	import django
	    django.get_version() 查看到对应版本,则证明安装成功

3.创建django项目
	1、创建django工程
		django-admin  startproject  项目名  

		进入到项目目录下 执行 python manage.py runserver 
	      可以开启服务器,开启后再浏览器中可以访问;本地访问
	2.创建一个应用(在项目目录下开启)
	     python manage.py startapp 应用名      

	3.pycharm打开选择manage.py的父目录打开即可
3.项目下各目录及.py介绍 
	1.app --- 应用名, 可以自定义,也可以创建,可以创建多个(小项目)
        1.migrations 目录, 迁移目录,是自动生成的,通常是生成数据库表的时候产生中间文件
        2.__init__.py 初始化包的时候调用,是一个包的标识
	  	3.admin.py  管理项目数据库的
	  	 4.apps  管理应用的
         **5.models.py models数据模型, 通常用来方便的操作数据库
          6.tests.py 测试的时候用, 往往开发完成的时候测试人员使用
	  	**7.views.py 视图函数, 通常用来处理业务逻辑 python代码
    2.week01--- 项目名, 放置管理整个项目的一些配置文件
	  	1.setting.py 整个项目的配置
	  	**2.urls.py  路由, 用来分发请求的url,将对应的url分发到对应views处理
    	3. wsgi.py 是uwsgi服务器的配置文件,开发完成上线的时候使用 
	3.db.sqlite3 数据库  
    4.manage.py 项目的配置文件,通常启动,生成数据库的时候使用,自动生成的自己创建的
    **5.templates目录模板,通常用来放置html模板

4.settting  文件介绍
    BASE_DIR : 项目的跟路径
	DEBUG :    是否开启调试模式,  开发的时候开启, True 开启,false关闭
	ALLOWED_HOSTS: 允许访问的主机地址,
	               默认只能本机访问, 
	              ["*"] 表示所有的地址都可以访问

    INSTALLED_APPS  已经安装的应用, 注意: 自己创建的应用需要添加进去
    MIDDLEWARE  中间健
    TEMPLATES  模板文件的配置
    DATABASES  配置数据库的
    LANGUAGE_CODE 配置语言的  中文: "zh-hans"
    TIME_ZONE  配置时区的      中国: "Asia/Shanghai"
    STATIC_URL 配置静态资源的
5.外网访问开发服务器
    1.如果是宿主机访问虚拟机需要设置网络 为 桥接模式 
	2.启动服务器:
	   1.在setting中设置 ALLOWED_HOSTS为 ["*"]
	   2.使用 python manage.py  runserver 0.0.0.0:端口号   2018/9/10来开启
	      则即可使用外网访问
            
	    
	    **命令 :  python manage.py  runserver   表示默认只能自己访问

    
6.demo-helloworld 
    流程: urls ---->  views 视图函数 ----> template html文件  --->views 视图函数响应
    开发流程: 倒着来   目的  
       1.template 模板中写到要展示的html网页
       2.views 视图函数中响应一个html,  如: return render(request,"模板名")
       3.urls 将url路径与视图函数对应即可

3.model 模型
   作用:  model模型, 通常用来方便的操作数据库: 1.可以方便的创建表 2.方便的增删改查 3.可以方便的在views中使用
     1.设计表:  
          字段1,字段2,.......  --->  sql: create table 表名(字段 字段类型,........)

         在django中直接写对应model模型,就可以自动的生成表
         如:
	 # 定义一个学生类
	# 注意: modle中定义的类需要继承 models.Model
	class  Student(models.Model):
	    s_name = models.CharField(max_length=50)
	    s_age = models.IntegerField(default=18)

     2.需要执行迁移才能自动生成对应的表
        1.生成迁移文件
         命令:  python  manage.py  makemigrations
	2.执行迁移文件
	  命令: python  manage.py migrate 
        3.执行迁移后,刷新后就可以看到自动创建的表
	   注意;首次执行迁移时,还会创建django项目需要的表
     3.如何连接数据库:
        pycharm 右侧----->database --->  +  ---->import from source  ---->test connect 如果不能点,需要点击下方的downlosd下载对应的驱动,--->再点击test connect--->成功后确定即可连接上
     4.如何使用pycharm管理数据库
        1.双击表名可以查看 表的所有数据
		2.插入/删除 一条数据  点击表的上方的 +/-按钮, 注意操作完后必须提交(db绿色向上箭头)才可生效
        3.注意:pycharm的数据操作后不会自动的刷新,开发测试数据的时候,需要手动刷新,来查看数据
	4.ddl按钮可以查看表的创建语句
	5.黑色图标的按钮, ---> new console --->可以输入sql语句 --->绿色按钮是执行
	    可以方便的操作数据库

二、MVC/MTV
M — model 数据模型层
作用:方便的操作数据库

1.连接数据库 ---- mysql,sqlserver, oracle…
0.django默认只能连接关系型数据库
1.安装依赖的库

    可以使用的库:  1. pymysql   2.python_mysql(不稳定)   3.mysqlclient(配置麻烦)
    安装pymsql: pip install pymysql 
如果出现 timeout 超时可以使用其他的资源下载:  pip install 模块名 -i  https://pypi.douban.com/simple
2. 导入库 
   
   在 __init__文件中编写:
     # 导入pymysql模块
	import  pymysql
	pymysql.install_as_MySQLdb()

3.在setting的database中配置mysql的连接

     'ENGINE': 'django.db.backends.mysql',  设置驱动
     'NAME':"week01",  设置数据库名
     'USER':'root',    设置用户名
     'PASSWORD':'123',  设置密码
     'HOST':'localhost',  设置主机地址
     'PORT':3306,  设置端口号


**4.注意:不要忘记了在数据库中创建该库
     create database  数据库名  charset='utf8';


5.连接mysql数据库
    点击左侧database --- + -----data source ----数据库类型(如:mysql) ----- 设置 账号,密码,主机,(注意: 如果对mysql设置远程连接,需要使用远程连接的账号密码)
    ----test connect ---- successful 即可 
6.测试程序能否能连
   1.执行迁移
      python manage.py makemigrations
  		python manage.py  migrate
   2.看到自动生成的表即可

2.orm 对象关系隐射 — 思想:相当于一个翻译机

   object  relational   mapping   
   1.开发人员不要写复杂的sql语句,直接调用对应的方法即可
   2.开发人员不需要封装查询结果,查询结果直接就是对象,可以直接使用
   3.如果开发人员需要跟换数据库, 不需要更改任何的代码,直接修改数据库的连接即可

3.创建一个表

  1.需要在model模块中创建一个类,注意该类必须继承 models.Model,
      注意: 表名默认是 应用名_类名
  2.定义属性名 ---属性需要与表中字段对应
     字段名即属性名 
     字段的数据类型
     字段的约束类型

		·django根据属性的类型确定以下信息
		·当前选择的数据库支持字段的类型
		·渲染管理表单时使用的默认html控件
		·在管理站点最低限度的验证

		·django会为表增加自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后,则django不会再生成默认的主键列

		·属性命名限制
			·遵循标识符规则
			·由于django的查询方式,不允许使用连续的下划线 

	库
		·定义属性时,需要字段类型,字段类型被定义在django.db.models.fields目录下,为了方便使用,被导入到django.db.models中

		·使用方式
			·导入from django.db import models
			·通过models.Field创建字段类型的对象,赋值给属性

	逻辑删除
		·对于重要数据都做逻辑删除,不做物理删除,实现方法是定义isDelete属性,类型为BooleanField,默认值为False

	字段类型
		·AutoField
			·一个根据实际ID自动增长的IntegerField,通常不指定如果不指定,一个主键字段将自动添加到模型中

		·CharField(max_length=字符长度)
			·字符串,默认的表单样式是 TextInput

		·TextField
			·大文本字段,一般超过4000使用,默认的表单控件是Textarea

		·IntegerField
			·整数

		·DecimalField(max_digits=None, decimal_places=None)
			·使用python的Decimal实例表示的十进制浮点数
			·参数说明
				·DecimalField.max_digits
					·位数总数
				·DecimalField.decimal_places
					·小数点后的数字位数

		·FloatField
			·用Python的float实例来表示的浮点数

		·BooleanField
			·true/false 字段,此字段的默认表单控制是CheckboxInput

		·NullBooleanField
			·支持null、true、false三种值

		·DateField([auto_now=False, auto_now_add=False])
			·使用Python的datetime.date实例表示的日期
			·参数说明
				·DateField.auto_now
					·每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false
				·DateField.auto_now_add
					·当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false
			·说明
				·该字段默认对应的表单控件是一个TextInput. 在管理员站点添加了一个JavaScript写的日历控件,和一个“Today"的快捷按钮,包含了一个额外的invalid_date错误消息键
			·注意
				·auto_now_add, auto_now, and default 这些设置是相互排斥的,他们之间的任何组合将会发生错误的结果

		·TimeField
			·使用Python的datetime.time实例表示的时间,参数同DateField

		·DateTimeField
			·使用Python的datetime.datetime实例表示的日期和时间,参数同DateField

		·FileField    
			·一个上传文件的字段

		·ImageField
			·继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是个有效的image
			
	字段选项
		·概述
			·通过字段选项,可以实现对字段的约束
			·在字段对象时通过关键字参数指定

		·null
			·如果为True,Django 将空值以NULL 存储到数据库中,默认值是 False

		·blank
			·如果为True,则该字段允许为空白,默认值是 False

		·注意
			·null是数据库范畴的概念,blank是表单验证证范畴的

		·db_column
			·字段的名称,如果未指定,则使用属性的名称

		·db_index
			·若值为 True, 则在表中会为此字段创建索引

		·default
			·默认值

		·primary_key
			·若为 True, 则该字段会成为模型的主键字段

		·unique
			·如果为 True, 这个字段在表中必须有唯一值

	关系
		·分类
			·ForeignKey:一对多,将字段定义在多的端中
			·ManyToManyField:多对多,将字段定义在两端中
			·OneToOneField:一对一,将字段定义在任意一端中
		·用一访问多
			·格式
				·对象.模型类小写_set
			·示例
				grade.students_set
		·用一访问一
			·格式
				·对象.模型类小写
			·示例
				·grade.students
		·访问id
			·格式
				·对象.属性_id
			·示例
				·student.sgrade_id
  1. 案例:

     # 定义模型
     # 注意: 执行迁移后,才会在数据库自动创建对应的表
     #默认的表名为:  应用名_类名     类名会自动转换成全小写
          可以使用(内部类):
         class Meta:     
     	db_table = "表名"  修改表名
     # 默认的字段名 就是 定义的属性名,  可以使用  db_column = "字段名" 来修改字段名
     # 默认会自动创建主键id,如果使用AutoField则不会自动创建
     class Person(models.Model):
         p_name = models.CharField(max_length=20,null=False,unique=True)
         p_age = models.IntegerField(default=10)
         p_sex = models.BooleanField(default=True)
         # ....
        # 表的结构是可以修改的,修改后,需要重新的迁移才能生效,最好不要修改
         # 注: 会自动的检测那些属性进行了修改	   
    

4.增加一个数据 view里创建一个函数,实例化

  1.创建一个对象
  2.设置属性
  3.保存数据
    对象名.save()

5.删除数据— delete from 表名 whree 条件

0.要删除数据,前提条件是先查询到对应的数据
1.删除:	
   # 可以直接删除多个结果,也可以直接删除一个
  查询结果.delete()

6.修改数据 ---- update 表名 set 字段名=数据,… where 条件

0.要修改数据,前提条件也是先查询到对应的数据
1.修改:
   对象名.属性名 = 值
   对象名.save()

7.查询数据

 1.查询方法  格式: 类名.objects.方法   ----支持链式调用 
  1.有多条结果的
     all()  获取所有的结果
	 filter(条件)  按照条件筛选数据
	 exclude(条件) 筛选出满足条件以外的数据
  2.有单个结果的
     first() 获取结果集的第一个
	 last()  获取结果集的最后一个
	 get()  获取一个结果, 注意: 有且只有一个结果的时候使用get()才可以,如果结果超过一个或者没有,程序都出错
  3.其他
    
     count() 获取结果集的数量
 	 order_by("-属性名") 表示按照属性名对应的值排序, 默认是升序,  -属性名表示降序排序
     如果是字符类型的数据,是按照字符对应的码表来排序的,一个字符一个字符的的比较,如: "aac"  "abc"  ,"aac"小,
     
	 exists() 判断查询结果集中是否有数据
	 values() 获取结果集的数据,该数据是类似字典的形式,方便操作

2.条件中的运算符

    格式:  属性名__运算符=值     是2个下划线
    运算符:
    gt 大于
    gte 大于等于
    lt 小于
    lte 小于等于
    = 等于 exact
    不等于    exclude(条件)
        
    isNull 是空的数据 

    startwith 查询以某个字符开始 
    endwith  查询以某个字符结尾的
    contain 查询包含某个字符的

    istartwith   i 是ignore的简写, 忽略大小写查询
    iendwith
    icontain 

    in  成员运算符,  是否是集合中值的其中一个,满足一个就符合条件 
    
    特使用法**  pk=值  pk是主健的简写    

3.Q与F对象

   1.Q对象, 用来帮助实现 逻辑运算符
     & 且  如: ...filter(Q(p_age__gt=90)&Q(p_age__lt=95))  注意导包
 	 | 或  如:  ....filter(Q(p_name="三胖胖40") | Q(p_name="三胖胖61"))
     ~ 非  如: ....filter(~Q(p_age__lte=100))
   2.F 对象, 用来帮助自己的属性与自己的属性比较  
       如:
   # 需求:实现年龄比id小的数据
      persons = Person.objects.filter(p_age__lt=F("id"))
4.查询结果的切片 
  格式: 结果集[start:stop]  包前不包后   截取从start位置到stop位置的数据   

5.聚合函数的使用

   Max
   Min
   Avg
   Sum  
   注意: 1.大小写 2.注意到包
      如: 
       # 求年龄最大的
    # res = Person.objects.all().aggregate(Max("p_age"))
    res = Person.objects.all().aggregate(Min("p_age"))

如何将urls中的内容分离 ?

	1.问题: 如果所有的urls路由都写在项目下的urls中,难以管理,不同应用之间还可能出现冲突
	2.解决: 将项目的urls 中的内容分离
	3.如何分离:
	   1.在应用目录下创建一个urls.py,代码与项目下的urls类似
	   2.在应用下的urls中可以添加自己引用对应的路由
	      如: url("路径",对应的视图函数)
	   3.还需要在项目的urls中添加应用的urls
	        如: url("应用名",include("应用名.urls"))
		注意:1.倒包  2.注意引号   3.注意  /
	   4.访问格式:  /应用名/路径   

猜你喜欢

转载自blog.csdn.net/wujialaoer/article/details/83589273
今日推荐