Django打造大型企业官网

第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 = 'rw+|(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': '3306',
    }
}

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='66')
    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=4))

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

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数据库练习题 

 

原文地址:https://www.cnblogs.com/tqtl911/p/9947858.html