第1章 Django预热

  • 1-为什么需要虚拟环境

  • 2-virtualenv创建虚拟环境

  • 3-virtualenvwrapper使用

  • 4-URL组成部分讲解

  • 5-课程准备工作

  • 6-Django介绍

第2章 Django URL

  • 7-第一个Django项目剖析(1)

  • 8-第一个Django项目剖析(2)

  • 9-Django的项目规范

  • 10-DEBUG模式详解

  • 11-视图函数介绍

  • 12-URL映射补充

  • 13-URL中传递参数给视图函数

  • 14-Django内置的URL转换器

  • 15-urls分层模块化

  • 16-url命名与反转url

  • 17-应用命名空间和实例命名空间

  • 18-include函数详解

  • 19-re_path函数详解

  • 20-reverse函数补充

  • 21-自定义path转换器

  • 22-URL映射时指定默认参数

第3章 Django模板

  • 24-模板查找路径配置

  • 25-模板变量使用详解

  • 26-if标签使用详解

  • 27-for标签使用详解

  • 28-with标签使用详解

  • 29-url标签使用详解

  • 30-autoescape标签使用详解

  • 31-verbatim标签使用详解

  • 32-DTL常用过滤器(1)

  • 33-DTL常用过滤器(2)

  • 34-DTL常用过滤器(3)

  • 35-DTL常用过滤器(4)

  • 36-DTL常用过滤器(5)

  • 37-自定义过滤器步骤详解

  • 38-自定义过滤器实战

  • 39-模板结构优化之include标签详解

  • 40-模板结构优化之继承详解

  • 41-模板中加载静态文件详解

第4章 Django数据库

  • 42-数据库操作相关软件和包介绍

  • 43-Django使用原生SQL语句操作数据库

  • 44-图书管理系统案例(1)

  • 45-图书管理系统案例(2)

  • 46-ORM模型介绍

  • 47-创建和映射ORM模型

  • 48-ORM模型的基本增删改查操作

  • 49-ORM常用Field详解(1)

  • 50-navie时间和aware时间详解

  • 51-ORM常用Field详解(2)

  • 52-ORM常用Field详解(3)

  • 53-Field常用参数详解

  • 54-Meta类中常见配置

  • 55-ORM外键使用详解

  • 56-ORM外键删除操作

  • 57-表关系之一对多

  • 58-表关系之一对一

  • 59-表关系之多对多

  • 60-ORM查询条件详解-准备工作

  • 61-PyCharm连接数据库

  • 62-ORM查询条件详解-exact和iexact

  • 63-ORM查询条件详解-contains和icontains

  • 64-ORM查询条件详解-in和关联模型查询

  • 65-ORM查询条件详解-gt、gte、it和ite

  • 66-ORM查询条件详解-startswith和endswith

  • 67-ORM查询条件详解-range

  • 68-ORM查询条件详解-date、time、year、week_day等

  • 69-ORM查询条件详解-isnull和regex

  • 70-ORM聚合函数详解-准备工作

  • 71-ORM聚合函数详解-Avg

  • 72-ORM聚合函数详解-aggregate和annotate

  • 73-ORM聚合函数详解-Count

  • 74-ORM聚合函数详解-Max和Min

  • 75-ORM聚合函数详解-Sum

  • 76-F表达式详解

  • 77-Q表达式详解

  • 78-objects对象所属类原理剖析

  • 79-QuerySet API详解-filter、exclude、annotate

  • 80-QuerySet API详解-order_by

  • 81-QuerySet API详解-values和values_list

  • 82-QuerySet API详解-all方法

  • 83-QuerySet API详解-select_related

  • 84-QuerySet API详解-prefetch_related

  • 85-QuerySet API详解-defer和only

  • 86-QuerySet API详解-get方法

  • 87-QuerySet API详解-create方法

  • 88-QuerySet API详解-get_or_create和bulk_create

  • 89-QuerySet API详解-count和exists

  • 90-QuerySet API详解-distinct

  • 91-QuerySet API详解-update和delete

  • 92-QuerySet API详解-切片操作

  • 93-QuerySet API详解-QuerySet转换为SQL的条件

  • 94-ORM作业讲解-准备工作

  • 95-ORM作业详解(1)

  • 96-ORM作业详解(2)

  • 97-ORM作业详解(3)

  • 98-ORM迁移详解-migrations命令补充

  • 99-ORM迁移详解-migrate命令报错解决方案

  • 100-根据已有的表生成ORM模型详解

  • 101-Django数据库练习题

1-为什么需要虚拟环境

1.1 隔离多套开发环境,比如Django1.10.1和Django2.0.1;

1.2 virtaulenv工具的使用;

1.3 不同项目依赖的第三方包是不同的,虚拟环境可以解决该情况;

2-virtualenv创建虚拟环境

2.1 安装virtualenv工具;

  • pip3 install virtualenv(Python3.x)
  • pip install virtualenv  (Python2.x)

2.2 创建虚拟环境;

  • virtualenv 虚拟环境的名称;

2.3 进入退出虚拟环境;

  • activate;
  • deactivate;

2.4 *nix进入虚拟环境;

  • source /path/to/virtualenv/bin/activate进入虚拟环境;

2.5 创建虚拟环境时候指定Python解释器版本;

  • virtualenv -p python解释器的路径;

3-virtualenvwrapper使用(用来管理virtualenv)

3.1 virtualenvwrapper的安装;

  • *nix:pip install virtualenvwrapper(自动将virtualenv安装好)
  • windows:pip install virtualenvwrapper-win

2.2 创建虚拟环境

  • mkvirtualenv 虚拟环境的名称;

2.3 进入虚拟环境;

  • workon 虚拟环境名称;

2.4 其他操作;

  • 退出虚拟环境deactivate;
  • 列出虚拟环境lsvirtualenv;
  • 删除虚拟环境rmvirtualenv;
  • 进入到虚拟环境所在目录cdvirtualenv;
  • 修改虚拟环境目录;

4-URL组成部分讲解

4.1 URL-Uniform Resource Locator,统一资源定位符;

  • scheme:协议;比如http,https;
  • host:主机名、域名;
  • port:端口号;
  • path:资源路径;
  • query-string:查询字符串,以键值对形式存在;
  • anchor:锚点,前端工程师用来做定位;

5-课程准备工作

5.1 已经安装了Python3.6及其以上的版本;

5.2 安装virtualenwrapper工具;

5.3 pip install django==2.0;

5.4 安装Pycharm 全宇宙最专业的Python IDE开发工具——(Professional版本和Community版本)比较耗费PC性能;

5.5 安装最新版本MySQL5.7.21;

5.6 安装pymysql驱动:pip install pymysql,是用Python来操作MySQL的中间件;

5.7 进入到虚拟环境后再进行安装;

6-Django介绍

6.1 Django历史及介绍;

6.2 快速开发;

6.3 大而全,Python web 开发的首选框架;

6.4 国内很多商业网站使用Django框架做支撑,所以不用担心Django框架的性能问题;

科技文章阅读:

Python + Django 如何支撑了 7 亿月活用户的 Instagram?

6.4. 各种服务器讲解;

  • Web服务器:Apache、Nginx、IIS;
  • 应用服务器:uwsgi、Tomcat;
  • Web应用框架:Django、Flask、Java中的SSH(Structs2+Spring3+Hibernate3)框架都是典型的Web应用框架;

7-第一个Django项目剖析(1)

7.1 创建Django项目

  • pip3 install django==2.0.2;
  • django-admin startproject  项目名称;
  • 创建应用:python manage.py startapp 应用名称;
  • 使用Pycharm IDE工具进行创建

7.2 运行项目;

  • python manage.py runserver (可指定端口号);

7.3 Pycharm中设置”单一实例“,避免一个项目运行多次;

8-第一个Django项目剖析(2)

8.1 Pycharm中修改Django项目的端口号、IP;

8.2 settings.py中设置ALLOWED_HOSTS = ['*'];

8.3 在Python manage.py runserser后添加IP和端口,如python manage.py runserver 0.0.0.0:8000

8.4 检查自己电脑的防火墙是否关闭;

8.5 python manage.py help

settings.py;

"""
Django settings for DjangoURL project. Generated by 'django-admin startproject' using Django 2.1.3. For more information on this file, see
https://docs.djangoproject.com/en/2.1/topics/settings/ For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.1/ref/settings/
""" import os # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '77g^#&!t_o%%5u8(3^6%(%y&37kazp4@77ij@th^o#qz0k6ye)' # SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True ALLOWED_HOSTS = ['*'] # Application definition INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
] MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
] ROOT_URLCONF = 'DjangoURL.urls' TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(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',
],
},
},
] WSGI_APPLICATION = 'DjangoURL.wsgi.application' # Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
} # Password validation
# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
] # Internationalization
# https://docs.djangoproject.com/en/2.1/topics/i18n/ LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/ STATIC_URL = '/static/'

manage.py;

urls.py;

wsgi.py;

9-Django的项目规范

9.1 视图函数初识;

9.2 什么是动态页面?是否与数据库有交互,即数据从数据库中查询所得;

9.3 Django中的models.py forms.py ;

9.4 Django快速创建app的命令:Python mange.py startapp 应用名称,即可创建app;

9.5 Django和Flask的区别:海军和海盗的区别,国军和八路的区别,正规军与土八路的区别;

9.6 创建项目与创建app的区别:django-admin与python manage.py;把所有的代码写在Django的app中;

10-DEBUG模式详解

10.1 如果设置了DEBUG = True,修改了代码后,按下Ctrl+S,就可以自动重启服务,便于调试代码;
10.2 设置了DUBUG=True模式后,会打印错误信息之浏览器中;
10.3 如果项目是要部署到生产环境中,一定要关闭DEBUG模式,即DEBUG=False;避免出现很大的安全隐患;
10.4 如果将DEBUG模式设置为False后,ALLOWED_HOST中必须设置IP地址,且IP地址为字符串形式;

11-视图函数介绍

11.1 视图一般都写在app的views.py中;

11.2 视图函数的第一参数永远是request;

11.3 视图函数的返回结果必须是HttpResponse对象或者其子类;

12-URL映射补充

12.1 为什么会去urls.py文件中寻找映射呢?

12.2 在urls.py中,所有的映射都应该放到urlpatters列表中;

13-URL中传递参数给视图函数

13.1 在url中使用变量的方式,在path的第一个参数中,使用’<参数名>‘的方式,可以传递参数;

13.2 在视图函数中也要写一个参数,视图函数中的参数必须和url中的参数名称保持一致,否则无法找到该参数,另外,url中可以传递多个参数;

13.3 采用”查询字符串“的方式,在url中,不需要单独的匹配查询字符串的部分,只需要在视图函数中使用request.GET.get('参数名称')的方式来获取,示例代码如下:

13.4 因为查询字符串使用的GET请求,所以我们通过request.GET来获取参数,因为GET是一个类似于字典的数据类型,所以获取值的方式与字典是一致的;

from django.shortcuts import render
from django.http import HttpResponse # Create your views here. def book(request):
return HttpResponse("图书首页") def book_detail(request, book_id, category_id):
text = "您获取的图书的id是:%s,图书分类为:%s" % (book_id, category_id)
return HttpResponse(text) def auth_detail(request):
author_id = request.GET.get('id')
text = '作者的id是:%s' % author_id
return HttpResponse(text)

14-Django内置的URL转换器

14.1 如果不在urls中指定转换器,默认是str类型;

14.2 UUID全宇宙的值;

14.3 url参数转换器:

  • str:除了斜杠”/“以外所有的字符都是可以的;
  • int:只有一个或多个阿拉伯数字;
  • path:所有的字符都是满足的;
  • uuid:只有满足”uuid.uuid4()“这个函数的返回值类型的字符串的格式;
  • slug:英文中的横杠或者英文字符或者阿拉伯数字或者下划线;

15-urls分层模块化

15.1 什么叫做url模块化呢?

在app中定义urls.py文件并在urls.py中进行include引入;

如果项目变得越来越大,那么url会变得越来越多,如果都放在主要的’urls.py‘文件中,那么后续将不太好管理,因此我们可以将每一个app自己url放到自己的app/urls.py文件中进行管理;

一般我们都会在每个app下新建立一个叫做urls.py的文件,用来存储自己的”子url“;

15.2 应该使用’include‘函数包含子urls.py,并且这个urls.py的路径是相对于项目的路径的,示例代码如下:

app/urls.py文件内容如下:

from django.urls import path
from book import views urlpatterns = [
path('', views.book),
path('detail/<book_id>/<category_id>/', views.book_detail),
path('author/', views.auth_detail),
path('publisher/<int:publisher_id>/', views.publisher_detail),
path('book_list/', views.book_list),
]

主要的urls.py文件内容如下:

from django.contrib import admin
from django.urls import path
from django.urls import include from django.http import HttpResponse
from django.urls import converters
from book import views def index(request):
return HttpResponse("豆瓣网首页") urlpatterns = [
path('admin/', admin.site.urls),
path('', index),
path('book/', include('book.urls'))
]

15.3 在app的urls.py中,所有的url匹配也要放在一个叫做’urlpatterns‘的列表中,否则无法查找;

15.4 url是会根据主’urls.py‘和app中的urls.py进行拼接的,因此注意避免多加斜杠!

16-url命名与反转url

16.1 为什么给url取名?

因为url是经常发生变化的,如果在代码中写死,可能会经常全局改动代码,给url取个名字,以后使用url时候,就使用他的名字进行reverse反转即可,就不需要写死url了,好处多多哦!

16.2 为什么需要命名空间呢?

在多个app之间,有可能产生同名的url,这种概率在开发过程中还是极高的,这个时候为了避免反转url的时候产生混淆,可以使用”应用命名空间“来做区分,定义应用命名空间非常简单,只要在app的urls.py中添加一个变量名:app_name即可,用来指定这个app的命名空间,示例代码如下所示:

PS:以后在做反转的时候,可以使用如下格式:”应用命名空间:url名称“的方式进行反转;、

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Project: DjangoURL
# Software: PyCharm2018.3
# DateTime: 2018-11-12 21:29
# File: urls.py
# __author__: 天晴天朗
# Email: tqtl@tqtl.org from django.urls import path
from front import views # 定义应用命名空间
app_name = 'front' urlpatterns = [
path('', views.index, name='index'),
path('login/', views.login, name='login'),
]

17-应用命名空间和实例命名空间

17.1 一个app可以创建多个实例,可以使用多个url映射同一个app,所以就会产生一个问题,以后在做反转的时候,如果使用应用命名空间,那么就会发生混淆,为了避免这个问题,我们可以使用实例命名空间,实例命名空间也是非常简单的,只要在include中,传递一个namespace变量即可,实例代码如下:

from django.contrib import admin
from django.urls import path
from django.urls import include from django.http import HttpResponse urlpatterns = [
path('admin/', admin.site.urls),
path('book/', include('book.urls')),
path('front/', include('front.urls')),
path('cms/', include('cms.urls')),
path('cms1/', include('cms.urls',namespace='cms1')),
path('cms2/', include('cms.urls',namespace='cms2')),
]

以后在做反转的时候,就可以根据实例命令空间来指定具体的url,实例代码如下:

from django.shortcuts import render
from django.http import HttpResponse # Create your views here. def index(request):
username = request.GET.get('username')
if username:
return HttpResponse("CMS的首页")
else:
current_namespace = request.resolver_match.namespace
return HttpResponse(reversed("%s:login" % current_namespace)) def login(request):
return HttpResponse("CMS登录的首页")

18-include函数详解(三种用法)

18.1 include(module,namespace = None)

  • module:子url的模块字符串
  • namespace:实例命名空间,这个地方需要注意一点,如果没有指定实例命名空间,那么前提必须要先指定应用命名空间,也就是在子urls.py中添加app_name变量;

18.2 include(pattern_list,app_namespace),namespace=None),include函数的第一个参数既可以是一个字符串,也可以是一个元组,如果是元组,那么元组的第一个参数是子urls.py模块的字符串,元组的第二个参数是应用命名空间,也就是说,应用命名空间既可以在子urls.py中指定也可以在include函数中指定;

18.3 include(pattern_list),其中pattern_list是一个列表,这个列表中的path或者re_path的实例代码如下:

urlpatterns = [
path('movie/',include([
  path('',views.movie),
  path('list/',views.movie_list),
]
))
]

19-re_path函数详解

19.1 为什么要使用re_path,re_path是包含正则表达式的path;

19.2 re_path的使用注意事项;

  • re_path和path的本质是一样的,只不过多了正则表达式的功能;
  • r'^$',以r开头,表示原生字符串,写正则表达式,推荐使用原生字符串,raw单词的缩写;
  • 在re_path中定义变量,格式(?P<变量名称>),详情如下:
  • path可满足大多数使用需求,特殊场景才会用到re_path,比如article/2018/12/19
  • 主urls中,注意结尾添加斜杠/;
# !/usr/bin/env python
# -*- coding:utf-8 -*-
# Project: DjangoURL
# Software: PyCharm2018.3
# DateTime: 2018-11-16 14:06
# File: urls.py
# __author__: 天晴天朗
# Email: tqtl@tqtl.org
from django.urls import re_path
from article import views urlpatterns = [
re_path(r'^$', views.article),
re_path(r'^list/(?P<year>\d{4})/$', views.article_list),
]

20-reverse函数补充

20.1 如果在反转url中需要使用到参数,可在reverse参数中添加kwargs={'key':value}(keywords+arguments的拼接缩写);

20.2 如果想要添加查询字符串比如?name = cuixiaozhao,需要手工进行拼接;

实例代码如下:

views.py;

from django.shortcuts import render
from django.shortcuts import redirect
from django.shortcuts import reverse
from django.http import HttpResponse # Create your views here.
def index(request):
"""
订单
:param request:
:return:
"""
return HttpResponse("订单首页") def login(request):
username = request.GET.get('username')
if username:
return HttpResponse('登录页面')
else:
# login_url = reverse('login')
detail_url = reverse('order_detail', kwargs={'order_id': 1})
return redirect(detail_url) def order_detail(request, order_id):
"""
订单详情
:param request:
:param order_id:
:return:
"""
text = "您的订单号是:%s" % order_id
return HttpResponse(text)

21-自定义path转换器

21.1 自定义path转换器7大步;

  • 定义一个类,继承至object;Python2分为经典类和新式类,Python统一为新式类;
  • 在类中定义一个属性,regex=‘xxx’,该属性用来限制url中转换器的正则表达式;
  • 实现to_pathon(self,value);
  • 实现to_url(self,value);
  • 将定义好的converter注册到django中,register_converters(自定义的转换器的类名称);
  • 将所有的代码写到一个独立的converters.py文件中;
  • 在项目的包的__init__.py文件中,进行converters的导入,即执行该文件中的代码,那么转换器将可以使用!
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Project: DjangoURL
# Software: PyCharm2018.3
# DateTime: 2018-11-16 15:31
# File: converters.py
# __author__: 天晴天朗
# Email: tqtl@tqtl.org from django.urls import register_converter class CategoryConverter(object):
"""
自定义urls转换器:cate;
"""
# 正则规则必须为regex名称;
regex = 'r\w+|(\w+\+\w+)+' def to_python(self, value):
"""
value:python + django + flask
['python','django','flask']
:param value:
:return:
"""
result = value.split('+')
return result def to_url(self, value):
"""
value:['python','django','flask']
python + django + flask
:param value:
:return:
"""
if isinstance(value, list):
result = "+".join(value)
return result
else:
raise RuntimeError('转换URL的时候,分类参数必须为列表形式!') register_converter(CategoryConverter, 'cate')

22-URL映射时指定默认参数

23-模板介绍

24-模板查找路径配置

24.1 首先在DIRS中配置的templates目录中查找;

24.2 其次在自身的app下的templates目录中查找;

24.3 最后会在其他app下的templates目录中查找;

25-模板变量使用详解

25.1 在模板中使用变量,需要将变量名放置到两个花括号中;

25.2 如果要访问对象的属性,需要使用”对象.属性名“的方式访问;

25.3 列表也是使用“点”的方式访问,而不是Python中的person[0]的方式;

25.4 因为在访问字典对象的时候也是通过person.keys的形式访问,所以不建议使用keys、items、values作为字典的键值存在;

26-if标签使用详解

26.1 所有的标签都是在“花括号百分号”中;

26.2 if有闭合标签endif;

26.3 if的语法和判断运算符(>=,<=,==以及in not in is not is等)和python中的是一致的;

27-for标签使用详解

27.1 for标签的总结:

  • for中不像Python中的那样,不会有break continue
  • for in endfor
  • for in empty endfor

28-with标签使用详解

28.1 在模板中想要定义变量,只能使用with语句进行定义;

28.2 使用with定义的变量,只能在该作用域中进行使用!

29-url标签使用详解

30-autoescape标签使用详解

31-verbatim标签使用详解

32-DTL常用过滤器(1)

33-DTL常用过滤器(2)

34-DTL常用过滤器(3)

35-DTL常用过滤器(4)

36-DTL常用过滤器(5)

37-自定义过滤器步骤详解

37.1 在app中创建包-templatetags,必须为这个名字;

  • my_filter.py
  • 定义过滤器函数,第一个参数永远为被过滤的值,最多有两个参数
  • 定义完成过滤器后要进行注册
  • 在DTL模板文件中使用load 加载过滤器的名称,进行引用前的加载工作;

38-自定义过滤器实战

38.1 可通过装饰器方式进行自定义过滤器的注册,亦可指定过滤器的名称;

39-模板结构优化之include标签详解

40-模板结构优化之继承详解

40.1 extends必须放在第一行;

41-模板中加载静态文件详解

章节 4 Django数据库

42-数据库操作相关软件和包介绍

  • mysql-python(仅支持Python2.x)
  • mysql-client(基于mysql-python,支持Python3.x)
  • pymysql(纯Python实现的驱动,性能不如以上)
  • MySQL(connector,C++连接器)

43-Django使用原生SQL语句操作数据库

# 修改数据库连接为MySQL数据库;
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'DataGather',
'USER': 'root',
'PASSWORD': 'Tqtl911!@#)^',
'HOST': '127.0.0.1',
'PORT': '',
}
}

44-图书管理系统案例(1)

45-图书管理系统案例(2)

46-ORM模型介绍

46.1 SQL语句重复利用率不高;

46.2 很多SQL

46.3 SQL注入问题;

ORM-对象关系映射,通过类的方式操作数据库;

ORM模型的好处:

  • 易用性;
  • 性能损耗小,综合考虑下,有点大于缺点;
  • 设计灵活;
  • 可移植性;

47-创建和映射ORM模型

47.1 如果不在models.py中指定表名,就会默认生成app名_类名的表名;

from django.db import models

# Create your models here.
class Book(models.Model):
"""书籍"""
id = models.AutoField(primary_key=True) # 代表是一个主键;
name = models.CharField(max_length=100, null=False, verbose_name='书籍名称')
author = models.CharField(max_length=100, null=False, verbose_name='书籍作者')
price = models.FloatField(null=False, default=0, verbose_name="书籍价格") class Publisher(models.Model):
"""出版社"""
name = models.CharField(max_length=100, null=False)
address = models.CharField(max_length=100, null=True)

48-ORM模型的基本增删改查操作

48.1 基本的增删改查操作:

  • 增加数据:实例化对象,然后save至数据库中;
  • 删除数据:根据主键或者其他方式,查询出来后,进行delete操作
  • 修改数据:先查询到数据,然后进行重新赋值操作,最后save至数据库中;
  • 查询数据:根据get或者filter方法,进行数据查询,可以使用first方法进行第一条数据的展示;
from django.shortcuts import render
from django.shortcuts import HttpResponse
from .models import Book # Create your views here. def index(request):
# 1、使用ORM添加一条数据到数据库中;
book = Book(name='西游记', author='吴承恩', price='')
book.save() # 2、进行书籍的查询;get和filter方法以及first方法;
book1 = Book.objects.get(pk=2) # 不管主键是id还是nid,都可以;
book2 = Book.objects.filter(name='西游记') # <QuerySet [<Book: <Book:(西游记,吴承恩,66.0)>>]>
book2 = Book.objects.filter(name='西游记').first() # <Book:(西游记,吴承恩,66.0)>
print(book2)
print(book1) # 3、删除数据-delete方法;
book3 = Book.objects.get(pk=5)
book3.delete() # 4、修改数据:先查询出来,再重新赋值,最后save至数据库;
book4 = Book.objects.get(pk=6)
book4.price = 1993
book4.save()# 注意不要忘记save方法;
return HttpResponse('书籍查询成功!')

49-ORM常用Field详解(1)

49.1 一些常见的Field;

  • BigAutoField
  • BooleanField
  • CharField和TextField,前者存储254字符,后者可以很大,酌情使用!

50-navie时间和aware时间详解

  • pytz 库是专门用来处理时区问题;默认安装Django的时候会自动安装上,也可以通过pip install pytz进行安装;
  • navie时间,不知道自己的时间表示的是哪个时区的;
  • aware表示知道自己是哪个时区的;
Python 3.6.7 (v3.6.7:6ec5cf24b7, Oct 20 2018, 13:35:33) [MSC v.1900 64 bit (AMD64)] on win32
Django 2.1.3
import pytz
from datetime import datetime
now = datetime.now()
now
datetime.datetime(2018, 11, 29, 16, 33, 41, 110258)
utc_timezone = pytz.timezone("UTC")
now.astimezone(utc_timezone)
datetime.datetime(2018, 11, 29, 8, 33, 41, 110258, tzinfo=<UTC>)
now = now.re
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'datetime.datetime' object has no attribute 're'
now = now.replace(day=22)
now
datetime.datetime(2018, 11, 22, 16, 33, 41, 110258)
now = now.replace(tzinfo=pytz.timezon)
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: module 'pytz' has no attribute 'timezon'
now = now.replace(tzinfo=pytz.timezon('Asia/Shanghai'))
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: module 'pytz' has no attribute 'timezon'
now = now.replace(tzinfo=pytz.timezone('Asia/Shanghai'))
now
datetime.datetime(2018, 11, 22, 16, 33, 41, 110258, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>)

如果USE_TZ设置为False,那么Django获取到的当前时间

51-ORM常用Field详解(2)

51.1 Django中的三种时间类型;

  • DateField
  • TimeField
  • DateTimeField

52-ORM常用Field详解(3)

52.1 其他的Field

  • EmailField,不会验证是否符合邮箱地址规则,本质是字符串,在ModelForm中会用到;
  • FileField;
  • FloatField;
  • IntegerField;
  • SmallIntegerField;
  • TextField;
  • URLField;

53-Field常用参数详解

  • null=True;
  • blank=True;
  • db_column = “映射到数据库中的名称”;
  • default = 0;
  • default = now;
  • primary_key = True;
  • unique =True,null = True;
  • choices = 变量名;

54-Meta类中常见配置

54.1 定义models的时候,Meta的常见配置;

  • db_table = “表名”
  • ordering = [“字段名”],最排序使用;可以添加负号,以升降序排序;

定义def __str__(self):定义方法,return "<(Author id:%s,create_time:%s)>"%(self.id,self.create_time),可以在视图函数中打印具体对象;

  • verbose_name = ""
  • verbose_name_plural= verbose_name

55-ORM外键使用详解

55.1 外键初识;

  • 跨app使用ForeignKey,需要制定app名称.model名称
  • self代表自身;

56-ORM外键删除操作

56.1 on_delete= models.CASCADE级联操作;on_delete=

56.2 on_delelte = models.PROTECT;

56.3 on_delete = models.SET_NULL;但是字段本身为null;

56.4 on_delete = models,SET_DEFAULT;被删除后,指定默认值;

56.5 on_delete = models.SET(此处可以指定一个函数),null=True)

56.6 DO_NOTHING,不采取任何行动,一切全看数据库级别的约束;

on_delete = models.SET_DEFAULT,null =True,default = Category.objects.get(pk=))

根据实际的业务进行指定以上两种类型;

57-表关系之一对多

58-表关系之一对一

59-表关系之多对多

60-ORM查询条件详解-准备工作

61-PyCharm连接数据库

驱动下载地址:https://dev.mysql.com/downloads/connector/j/

62-ORM查询条件详解-exact和iexact

62.1 collation排序规则-大小写敏感与不敏感(utf8_bin与)

62.2 exact(相当于==)与iexact(ignore exact相当于like);

from django.shortcuts import render

from django.http import HttpResponse

# from .models import Article
from .models import * # Create your views here. def index(request):
# 1、id =1和 id__exact =1 两者等价;
# article = Article.objects.filter(id__exact=1)# 两者等价!
# article = Article.objects.filter(id=1) # 两者等价! # 2、 区分大小写和不区分大小写!涉及到MySQL数据库的排序规则;# 查看ORM翻译成的SQL语句,仅适用于filter语句中,get会报错!
article = Article.objects.filter(title__exact='Hello World')
# SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`title` = Hello World # 3、None语句的查询;
# article = Article.objects.filter(title__exact=None)
# SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`title` IS NULL # 4、忽略大小写的查询,比如exact和iexact;
article = Article.objects.filter(title__iexact='HELLO WORLD')
# SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`title` LIKE HELLO WORLD
print(article)
print(article.query)
return HttpResponse('查询成功!') """
小结:
1、exact翻译成=;
2、iexact翻译成LIKE;
"""

63-ORM查询条件详解-contains和icontains

63.1 query对象可以查看ORM翻译成的原生SQL语句是什么;

63.2 contains和icontains的区别;

from django.shortcuts import render

from django.http import HttpResponse

# from .models import Article
from .models import * # Create your views here. # def index(request):
# # 1、id =1和 id__exact =1 两者等价;
# # article = Article.objects.filter(id__exact=1)# 两者等价!
# # article = Article.objects.filter(id=1) # 两者等价!
#
# # 2、 区分大小写和不区分大小写!涉及到MySQL数据库的排序规则;# 查看ORM翻译成的SQL语句,仅适用于filter语句中,get会报错!
# article = Article.objects.filter(title__exact='Hello World')
# # SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`title` = Hello World
#
# # 3、None语句的查询;
# # article = Article.objects.filter(title__exact=None)
# # SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`title` IS NULL
#
# # 4、忽略大小写的查询,比如exact和iexact;
# article = Article.objects.filter(title__iexact='HELLO WORLD')
# # SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`title` LIKE HELLO WORLD
# print(article)
# print(article.query)
# return HttpResponse('查询成功!') """
小结:
1、exact翻译成=;
2、iexact翻译成LIKE;
""" def index1(request):
article = Article.objects.filter(pk__exact=1)
print(type(article))
print(article)
print(article.query)
"""
<class 'django.db.models.query.QuerySet'>
<QuerySet [<Article: Article object (1)>]>
SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`id` = 1
"""
return HttpResponse('index1') def index2(request):
# result = Article.objects.filter(title__contains='hello world')
RESULT = Article.objects.filter(title__icontains='HELLO WORLD')
print(RESULT)
print(RESULT.query) """
1、使用contains:
<QuerySet []>
SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`title` LIKE BINARY %hello world%
2、使用icontains:
<QuerySet [<Article: Article object (3)>]>
SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`title` LIKE %HELLO WORLD%
"""
return HttpResponse('contains&icontains的区别,比如LIKE和LIKE BINARY')

64-ORM查询条件详解-in和关联模型查询

64.1 in可以指定元组、列表以及QuerySet对象;

64.2 related_name='article' 的使用;

64.3 反向查询是将模型的名字小写化,比如‘article__in’

from django.db import models

# Create your models here.

class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
category = models.ForeignKey('Category',null=True, on_delete=models.CASCADE,related_name='article') class Meta:
db_table = 'article' class Category(models.Model):
name = models.CharField(max_length=128) class Meta:
db_table = 'category'

65-ORM查询条件详解-gt、gte、it和ite

66-ORM查询条件详解-startswith和endswith

67-ORM查询条件详解-range

68-ORM查询条件详解-date、time、year、week_day等

69-ORM查询条件详解-isnull和regex

70-ORM聚合函数详解-准备工作

71-ORM聚合函数详解-Avg

72-ORM聚合函数详解-aggregate和annotate

73-ORM聚合函数详解-Count

74-ORM聚合函数详解-Max和Min

75-ORM聚合函数详解-Sum

76-F表达式详解

77-Q表达式详解

78-objects对象所属类原理剖析

79-QuerySet API详解-filter、exclude、annotate

80-QuerySet API详解-order_by

81-QuerySet API详解-values和values_list

82-QuerySet API详解-all方法

83-QuerySet API详解-select_related

84-QuerySet API详解-prefetch_related

85-QuerySet API详解-defer和only

86-QuerySet API详解-get方法

87-QuerySet API详解-create方法

88-QuerySet API详解-get_or_create和bulk_create

89-QuerySet API详解-count和exists

90-QuerySet API详解-distinct

91-QuerySet API详解-update和delete

92-QuerySet API详解-切片操作

93-QuerySet API详解-QuerySet转换为SQL的条件

94-ORM作业讲解-准备工作

95-ORM作业详解(1)

96-ORM作业详解(2)

97-ORM作业详解(3)

98-ORM迁移详解-migrations命令补充

99-ORM迁移详解-migrate命令报错解决方案

100-根据已有的表生成ORM模型详解

101-Django数据库练习题

Django打造大型企业官网的更多相关文章

  1. 超细讲解Django打造大型企业官网

    本文为知了课堂黄勇老师讲的<超细讲解Django打造大型企业官网>的笔记. 第一章 Django预热 1.创建virtualenv虚拟环境 2.URL组成部分详解 3.Django介绍 4 ...

  2. Django打造大型企业官网(二)

    三.项目环境搭建 3.1.创建项目环境和安装包 创建django项目 mkvirtualenv DjangoProject workon DjangoProject pip install -i ht ...

  3. Django打造大型企业官网(八)

    4.16.侧边栏标题和广告位布局完成 templates/news/index.html <div class="sidebar-wrapper"> <div c ...

  4. Django打造大型企业官网(七)

    4.13.新闻列表tab栏布局完成 templates/news/index.html <div class="list-outer-group"> <ul cl ...

  5. Django打造大型企业官网(六)

    4.9.根据轮播图个数修改小圆点数量 src/js/index.js function Banner() { this.bannerWidth = 798; } Banner.prototype.in ...

  6. Django打造大型企业官网(五)

    4.6.切换轮播图的箭头样式以及显示和隐藏 templates/news/index.html <span class="arrow left-arrow">‹< ...

  7. Django打造大型企业官网(四)

    4.3.轮播图布局和样式 templates/news/index.html <div class="news-wrapper"> <div class=&quo ...

  8. Django打造大型企业官网(三)

    四.前端首页 4.1.导航条实现 (1)templates/new/index.html <!DOCTYPE html> <html lang="en"> ...

  9. Django打造大型企业官网(一)

    一.nvm的安装 (1)下载:nvm1.16 (2)安装完成后添加环境变量 C:\Users\Administrator\AppData\Roaming\nvm (3)修改settings.txt,将 ...

随机推荐

  1. WebNotes(PHP、css、JavaScript等)

    1. 数据库编码格式 gb-2312仅支持简体中文,GBK支持简体.繁体中文,utf-8通用程度最高. 2. HTTP请求方法 get方法请求时,会将传输的数据跟在链接后“显式地”发送,受限于链接长度 ...

  2. Android学习笔记_25_多媒体之在线播放器

    一.布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andr ...

  3. CSS 中定位方式有几种,说明他们的意义

    1.static  默认定位方式 显示为没有设置定位时的位置 2.fixed(固定定位)  他所相对固定的对象是可视窗口,与其他无关.以浏览器窗口作为参考进行定位 3.relative(相对定位) 元 ...

  4. 几个常用的 Git 高级命令

    Git 是一款开源优秀的版本管理工具,它最初由 Linus Torvalds 等人开发,用于管理 Linux Kernel 的版本研发.相关的书籍和教程网上琳琅满目,它们多数都详细的介绍其基本的使用和 ...

  5. Unity 游戏框架搭建 (十) QFramework v0.0.2小结

    从框架搭建系列的第一篇文章开始到现在有四个多月时间了,这段时间对自己来说有很多的收获,好多小伙伴和前辈不管是在评论区还是私下里给出的建议非常有参考性,在此先谢过各位. 说到是一篇小节,先列出框架的概要 ...

  6. BionicApi 学习笔记

    1.内存管理 malloc, realloc, free new, delete2.文件输入操作 fopen, fwrite, fputs, fputc, fprintf, fflush fread, ...

  7. 一站式学习Redis 从入门到高可用分布式实践(慕课)第六章 Redis开发运维常见问题

    fork操作 1.同步操作 2.与内存量息息相关:内存越大,耗时越长(与机器类型有关) 3.info:latest_fork_usec 进程外开销 AOF追加阻塞 不知道哪个命令??? 单机多实例部署 ...

  8. 【2018 ICPC南京网络赛 A】An Olympian Math Problem(数论题)

    Alice, a student of grade 6, is thinking about an Olympian Math problem, but she feels so despair th ...

  9. CentOS7 64位下 MySQL5.7的安装与配置(YUM)

    趁着11.11的时候在阿里云上弄了一云服务ECS(作为自己的节日礼物 > _ <) ,系统为CentOS的,打算弄一个人博客之类的,这些天正在备案当中(不知得多久). 忙里偷闲,在中午休息 ...

  10. MySQL实现序列自增

    #创建序列表 DROP TABLE IF EXISTS `sequence`; CREATE TABLE `sequence` ( `name` ) NOT NULL COMMENT '序列名称', ...