Django笔记——Python Web 框架

添加小程序,兑换各种视频教程/数据资源。

1.Django:即是一个开放源代码的Web应用框架,由Python写成,采用了MVC的框架模式思想,但是有自有的名字MVT,中文文档:https://docs.djangoproject.com/zh-hans/2.0/。

MVC框架如图:

Django笔记——Python Web 框架_第1张图片

 

Django模式如下:

Django笔记——Python Web 框架_第2张图片

ORM模型:Django中嵌了ORM框架,ORM框架可以将类(如图书类)和表(如mysql数据库的图书表)对应起来,只需要通过类操作,就可以操作数据库的表,且会自动生成数据库的表。

Django笔记——Python Web 框架_第3张图片

2. 安装python第三方包:下载python,cmd->py查看python版本->cd C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Scripts进入srcipts目录->pip install 第三方包名。

注意:C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Scripts是默认安装的Py地址。

3. 虚拟环境:就是真实python环境的复制版本。

4. 安装django,创建django项目:

     4.1 安装django: 在C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Scripts命令行下输入pip install django,创建的django项目文件在Lib/site-packages下,可能存在pip版本太低,python环境变量配置。

     4.2 创建django项目:在C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Scripts(在Lib/site-packages/django)命令行下输入

django-admin startproject HelloWorld(项目名)

Django笔记——Python Web 框架_第4张图片

      4.3 创建django项目(即HelloWorld(项目名))的一个应用(Django中一个功能模块对应一个应用,如用户模块,商品模块,购物车模块,订单模块):如在HelloWorld文件夹的命令行下输入py manage.py startapp booktest(应用名,如图书模块)。

Django笔记——Python Web 框架_第5张图片

       4.4 创建Django项目(helloworld)与应用(booktest)直接的联系:进行应用注册。在helloworld/helloworld下的settings.py中进行设置。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'booktest',   #进行应用(功能模块)的注册。
]

      4.5 启动Django项目: 在Django项目(hellowworld)文件命令行下,执行输入py manage.py runserver。然后返回一个浏览器打开的ip地址,默认是浏览器输入127.0.0.1:8000即可。

      4.6 创建模型类(如图书信息BookInfo):相当于对应数据库的表名(BookInfo)。

from django.db import models


# Create your models here.
#创建与数据表对应的模型类

#1.创建一个图书类BookInfo,该类必须继承models.Model,才是模型类
class BookInfo(models.Model):   #对应数据库的表名(BookInfo)
    #1.1 图书名称(btitle)对应数据表(BookInfo)的列名,CharFiled表示列类型为字符串,max_length表示最大长度字符串为20
    btitle=models.CharFiled(max_length=20)
    #1.2 图书出版日期(bpub_data)对应数据表(BookInfo)的列名,DateFiled表示列类型为日期类型
    bpub_data=models.DateFiled()
    #1.3 注意:不需要创建表(BookInfo)的id,Django会自动生成

#2.创建一个英雄人物类,该类必须继承models.Model,才是模型类
class HeroInfo(models.Model):   #对应数据库的表名(BookInfo)
    #2.1 英雄姓名(hname)对应数据表(HeroInfo)的列名,CharFiled表示列类型为字符串,max_length表示最大长度字符串为20
    hname=models.CharFiled(max_length=20)
    #2.2 英雄性别(hgender)对应数据表(HeroInfo)的列名,BooleanFiled表示列类型为布尔类型,default默认值
    hgender=models.BooleanFiled(default="男")  
    #2.3 英雄备注(hcomment)对应数据表(HeroInfo)的列名,CharFiled表示列类型为字符串,max_length表示最大长度字符串为20
    hcomment=models.CharFiled(max_length=20)
    #2.4 关系属性(hbook)对应数据表(HeroInfo)的列名,与图书类BookInfo有外键关联(ForeignKey)
    hbook=models.ForeignKey("BookInfo")
  

     4.7 将模型类生成表:

              第一步生产迁移文件:在Django项目命令行下输入执行py manage.py makemigrations。会放在booktest/migrations文件下自动生成0001_initial.py。

              第二步执行迁移生成表:在Django项目命令行下输入执行py manage.py migrate

    4.8 在终端命令行中执行该模型类的增删该查:在Django项目命令行下输入执行py manage.py shell。进入终端操作:

form booktest.models import BookInfo
#1. 实例化一个BookInfo模型类
b=BookInfo()
#2. 修改/获取模型类中列的值
b.btitle="天龙八部"
from datetime import date
b.bpub_date=date(2018.10.28)
#3. 保存修改的执行
b.save()
#4. 实例化一个HeroInfo模型类
h=HeroInfo()
#5. 赋值
h.hname="段誉"
h.hgender="男"
h.hcomment="六脉神剑"
#6. 外键关联BookInfo模型类的实例化
h.hbook=b
#7.保存    
h.save()

5. Django后台管理:

          5.1 本地化:即在settings.py中修改时间和语言(默认是美国时间和英文):

#LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans'   #使用中文
#TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shangehai'   #没有北京时间,改成亚洲上海时间

         5.2 创建管理员:在Django项目命令行下输入执行py manage.py createsuperuser->在命令行输入姓名,邮箱,密码->

然后py manage.py runserver启动服务器->在浏览器输入127.0.0.1:8000/admin/即为Django登录页面。

        5.3 在admin.py里创建注册模型类:可以直接显示在浏览器视图中。

        5.4 数据库配置:即在settings.py中配置数据库:

DATABASES = {
    'default': {
        #默认是 sqlite数据库配置       
        #'ENGINE': 'django.db.backends.sqlite3',
        #'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        #将数据库配置成mysql
        'ENGINE': 'django.db.backends.mysql',  #表示配置的是mysql数据库
        'NAME': "books",  #要使用的mysql数据名字,手动创建
        "USER":"root",  #连接mysql的用户名
        'PASSWORD':'',   #连接mysql的密码
        'HOST':'localhost',  #数据库所在电脑的ip,本机是localhost
        "PORT":3306  #mysql默认3306端口
    }
}

注意:切换mysql数据库之后不能启动服务器,如果虚拟环境中没有mysql,需要在python3中pip install pysqml,然后在配置文件helloworld/__init__.py里面配置:

import pymysql
pymysql.install_as_MySQLdb()

6. 配置路由:如127.0.0.1:8000/admin或127.0.0.1:8000/index..............。

        6.1 在helloworld/helloworld/urls.py里面配置:    应用(booktest)的路由。

from django.contrib import admin
from django.urls import path,include,url


#项目的urls文件
urlpatterns = [
    path('admin/', admin.site.urls),  #配置项目,即127.0.0.1:8000/admin显示的视图页面。
    url(r'^',include('booktest.urls')),  #配置除了127.0.0.1:8000/admin路径之外的其他路径在booktest/urls.py文件里面查找。
]

        6.2 在helloworld/booktest/urls.py里面配置:     应用(booktest)里面的视图路由。

from django.urls import url
from booktest import views



#配置views.py里面的index/index2的路径
urlpatterns = [
    url(r'^index$',views.index),  #配置127.0.0.1:8000/index路径
    url(r'^index2$',views.index2),  #配置127.0.0.1:8000/index2路径
    url(r'^book/(\d+)$',views.details),  #(\d)表示路由传数字参时,根据参数不同,显示不同商品的详情,如跳转至book/2页面
]

      6.3 在helloworld/booktest/views.py里面配置:     应用(booktest)里面的视图。

from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
#1.定义视图函数,HttpResponse
#2.定义url配置,建立url和视图的关系

def index(request):  #对应视图127.0.0.1:8000/index
    return HttpResponse("这是在浏览器输入127.0.0.1:8000/index时,页面显示的内容")

def index2(request):  #对应视图127.0.0.1:8000/index2
    return HttpResponse("这是在浏览器输入127.0.0.1:8000/index2时,页面显示的内容")

7. 模板的配置:即应用(booktest)里面的视图返回的具体html内容。

      7.1 在项目helloworld下创建模板文件夹templates:即其应用booktest对应的index.html,如templates/booktest/index.html。



	
		
		这是booktest应用的html模板
	
	
        新增
    
		

这是booktest应用的html模板

使用模板变量:{{content}} 使用列表:{{list}} 使用for循环:
    {% for i in list %}
  • {{i}}
  • {% empty%}
  • 这里list为空时显示的----- 删除
  • {% endfor %}

      7.2 配置模板:在配置文件helloworld/settings.py下

import os


BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,"templates")],   #这里是配置模板目录文件,即将项目的绝对路径BASE_DIR和文件夹templates进行拼接
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

      7.3 配置模板:在helloworld/booktest/views.py里面配置,应用(booktest)里面的html模板视图,即浏览器输入127.0.0.1:8000/index就会显示的html内容。

from django.shortcuts import render,redirect
from django.http import HttpResponse,HttpResponseRedirect
from django.template import loader,RequestContext
# Create your views here.
#1.定义视图函数,HttpResponse
#2.定义url配置,建立url和视图的关系

def my_render(request,template_path,content_dict):
    '''封装使用模板文件函数,和from django.shortcuts import render函数一模一样'''
    #1.加载模板文件,模板对象,如index.html
    temp=loader.get_template(template_path)
    #2.定义模板上下文:给模板文件传递数据,如在index.html里通过{{content}}渲染
    context=RequestContext(request,content_dict)   #content_dict是字典,如{'content':"这是要传递在模板中content显示的值"}
    #3.模板的渲染:产生标准的html内容
    res_html=temp.render(context)
    #4. 返回给浏览器
    return HttpResponse(res_html)

def index(request):  #对应视图127.0.0.1:8000/index
   # return HttpResponse("这是在浏览器输入127.0.0.1:8000/index时,页面显示的内容")
   #return my_render(request,"booktest/index.html",{'content':"hello world"})
   return render(request,"booktest/index.html",{'content':"hello world",'list':list(range(1,10))})    #自己封装的my_render和from django.shortcuts import render函数一致一样
   
   

def index2(request):  #对应视图127.0.0.1:8000/index2
    return HttpResponseRedirect("index")   #相当于return redirect("/index")
    #重定向:服务器不返回页面,而是告诉浏览器再去请求其他url地址 如在"booktest/index.html页面里有的id的参数值bid,从数据库中查找到数据
    booke.delete()     #删除该数据
    return redirect("/index")  #重定向







8. 字段属性和选项:

字段属性
类型 描述
AutoField 自增长,默认不指定时,会自动以id自动增长。
BooleanField 布尔
NullBooleanField 布尔和NULL
CharField(max_length=最大长度) 字符串的最大长度,max_length必填。
TextField 大文本,一般超过4000个字。
IntegerField 整数

DecimalField(max_digits=None,

decimal_places=None)

十进制小数,max_digits总位数,decimal_places小数位数。
FloatField 同上,但是精度差些。

DateField([auto_now=False,

auto_now_add=False])

日期年月日,auto_now是修改时间,auto_now_add创建时间。2者不可同时用。
TimeField 时间时分秒,参数同上。
DateTimeField 日期时间年月日时分秒,参数同上。
FileField 上传文件字段。
ImageField 继承FileField,对上传文件字段校对,确保是有效图片。

 

选项
选项名 描述
default 默认值
primary_key 主键,默认false。一般作为AutoField选项使用。
unique 是否唯一,默认false。
null 是否为空,默认值false。
blank 是否有空白,默认值为false。

9. 模型类的查询:

模型类型的查询函数:模型类.objects.函数名
函数名 功能 例如
get 返回表中满足条件的有且只有一条数据 查询id=1的数据:BookInfo.objects.get(id=1)。
all* 返回所有数据 查询所有数据:BookInfo.objects.all()。
exclude* 返回不满足条件的所有数据 查询除了id=1外的所有数据:BookInfo.objects.exclude(id=1)。
order_by* 查询结果的排序 查询所有数据按照id排序升序:BookInfo.objects.all().order_by("id"),('-id')表示降序。
filter* 返回满足条件的所有数据

查询id=1的数据:

BookInfo.objects.filter(id_exact=1)。

查询书名包含“传”的数据:

BookInfo.objects.filter(btitle_contains='传')。

查询以传开头(startswith)/结尾(endswith)的数据:

BookInfo.objects.filter(btitle_endswith='传')。

查询不为空的数据:

BookInfo.objects.filter(btitle_isnull=False)。

查询id=1,3,5的数据:-----范围查询in

BookInfo.objects.filter(id_in=[1,3,5])。

查询gt,lt,gte,lte(>,<,>=,<=):-----比较查询

BookInfo.objects.filter(id_gt=5)。

日期查询:

BookInfo.objects.filter(bput_data_year=1990),查询1990年出版。

BookInfo.objects.filter(bput_data_lt=data(1990,1,1)),查询1990年1月1日之后出版。

F对象:类属性(数据表中不同列)的比较。

from django.db.models import F

BookInfo.objects.filter(bread__gt=F("bcomment")*2),查询阅读量大于2倍评论量的信息。

Q对象:逻辑查询(与(&),或(|),非(~))。

from django.db.models import Q

BookInfo.objects.filter(Q(bread__gt=3) | Q(id__gt=5),查询阅读量大于3或id大于5的信息。

BookInfo.objects.filter(~Q(id=3)),查询id不等于3。

聚合函数:Sum,Count,Avg,Max,Min。aggregate返回字典。

from django.db.models import Sum,Count,Avg,Max,Min。

BookInfo.objects.all().aggregate(Sum('bread')),查询阅读量的总数。

count函数:返回一个数字。

BookInfo.objects.filter(id__gt=3).count(),查询Id大于3的数目。

注意:带*的函数名返回的是查询集(特性:缓存和惰性查询),可以对其进行切片或下标操作产生新的查询集。如b=BookInfo.objects.all();b[0]或b[0:1].get()为取出查询集的第一个数据,如果第一个数据不存在会抛出异常,可以通过b.exists()返回false/true来判断是否有数据。

10.  模型类的关系:即数据库中表与表的关系。

        10.1 一对多:如图书类——英雄人物类,models.ForeignKey() 只能定义在英雄人物类中。

        10.2 多对多:如新闻类——新闻类型类 体育新闻 国际新闻,models.ManyToManyField() 定义哪个类中都可以。

        10.3 一对一:如员工基本信息类——员工信息详情类,models.OneToOneField() 定义哪个类中都可以。

#1. 一对多:图书类——英雄人物类。
class BookInfo(models.Model):   #图书类   
    btitle=models.CharFiled(max_length=20)  #图书名
    bpub_data=models.DateFiled()      #出版日期  
class heroInfo(models.Model):   #英雄人物类  
    hname=models.CharFiled(max_length=20)  #英雄人名
    hbook=models.ForeignKey("BookInfo") #英雄出自哪本书
   

#2. 多对多:新闻类——新闻类型类。
class NewType(models.Model):   #新闻类型类
    type_name=models.CharFiled(max_length=20)  #新闻类型
    type_new=models.ManyToManyField("NewInfo")      #关系属性
class NewInfo(models.Model):   #新闻类
    new_title=models.CharFiled(max_length=20)  #新闻标题
    #new_type=models.ManyToManyField("NewType")      #关系属性,或写上面或写这里
   

#3. 一对一:员工基本信息类——员工信息详情类。
class EmployInfo(models.Model):   #员工基本信息类
    employ_name=models.CharFiled(max_length=20)  #员工姓名
    type_new=models.OneToOneField("EmployDetail")      #关系属性
class EmployDetail(models.Model):   #员工信息详情类
    detail_address=models.CharFiled(max_length=20)  #员工地址
    #new_type=models.OneToOneField("EmployInfo")      #关系属性,或写上面或写这里
   

11. 关联查询(一对多):

Django笔记——Python Web 框架_第6张图片

 

       11.1 方法1:           

            如:查询id为1的图书关联的英雄信息:

                   b=BookInfo.objects.get(id=1);

                   b.heroinfo__set.all()

        11.2 通过模型类实现关联查询:即最终要查询哪个表的数据,就以哪个表名开始,如查询....图书信息: BookInfo.objects.filter()   ,查询......的所有英雄 HerpInfo.objects.filter()。

            如:查询图书信息,要求图书关联的英雄描述包含‘八’。

                   BookInfo.objects.filter(heroinfo__hcomment__contains='八')          

            如:查询书名为天龙八部的所有英雄。

                   HerpInfo.objects.filter(hbook__btitle='天龙八部')

   2种写法:一类名.objects.filter(小写的多类名__多类名属性__条件)

                    多类名.objects.filter(关联属性(不是小写一类名)__一类名属性__条件)

12. 查入、更新和删除:

     12.1 查入和更新:调用模型类对象的save方法。

     12.2 删除:调用模型类对象的delete方法。

13. 自关联:  地区表有一对多,即字关联。             

#在model.py中:
class AreaInfo(models.Model):
    '''地区模型表'''
    #地区名称
    atitle=models.CharField(max_length=10)
    #关系属性,代表当前地区的父级地区,即自关联
    aParent=models.ForeignKey("self",null=True,black=True)

  

     Django笔记——Python Web 框架_第7张图片

14. 模型管理器objects:如BookInfo.objects.all(),可以自定义一个模型管理器,在改自定义模型管理器中可以修改查询结果和添加额外的方法。

#在model.py中:

class MyManager(models.Manager):   
    '''自定义一个模型管理器,继承原始的模型管理器models.Manager'''
    #作用1:修改查询结果集
    def all(self):
        #1.1 调用父类的all方法,获取所有数据。如BookInfo.objects.all()。
        lists=supper().all()   #相当于BookInfo.objects.all()。
        #1.2 对所有数据进行筛选。如筛选出id大于3的数据
        list=lists.filter(id_gt=3)
        #1.3 返回
        return list       #相当于对原生管理器BookInfo.objects.all()的结果进行筛选。

    #作用2:添加其他方法,如对数据库的增删改查操作方法。
    def add(self,b1,b2):
        #2.1 创建一个模型类的实例对象
        book=BookInfo()
        book.btitle=b1
        book.bpub_data=b2
        #2.2 保存修改
        book.save()
        #2.3 返回
        return book     

class BookInfo(models.Model):   #图书类   
    btitle=models.CharFiled(max_length=20)  #图书名
    bpub_data=models.DateFiled()      #出版日期  
    
    book_objects=MyManager()  #实例一个自定义的模型管理器,通过BookInfo.book_objects.all()
                              #和BookInfo.book_objects.add("三国",'1991-10-23')实现自定义管理器的使用

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(python)