zoukankan      html  css  js  c++  java
  • 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数据库练习题 

     

  • 相关阅读:
    JAVA_Collection容器
    ArrayList实现分组功能
    scrapy 安装出错 [err2] no such file or directory: 'README.rst'【已解决】
    python spyder 今天突然打不开了【已解决】
    SVN使用教程总结
    MVC框架浅析(基于PHP)
    Web性能优化方案
    野生程序员的故事
    js控制页面跳转,清缓存,强制刷新页面
    js中json处理总结之JSON.parse
  • 原文地址:https://www.cnblogs.com/tqtl911/p/9947858.html
Copyright © 2011-2022 走看看