学习 Python Django

Posted _DiMinisH

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习 Python Django相关的知识,希望对你有一定的参考价值。

学习 Python Django

学习 Django

1. 初识Django命令

(1). 基本命令

命令作用
startproject启动Django项目
startapp启动Django应用
check校验项目完整性
runserver运行项目
shellDjango Shell
test执行Django测试用例

(2). 数据库相关命令

命令作用
makemigrations创建模型变更的迁移文件
migrate执行上一个makemigrations命令创建的迁移文件
dumpdata把数据库数据导出到文件
loaddata把文件数据导入数据库

2. 初识Django项目

(1). 创建项目

django-admin startproject 项目名字
文件作用
settings.pyDjango项目配置文件
urls.pyDjango项目路由文件
wsgi.pyDjango项目作为wsgi应用文件
manage.pyDjango项目管理文件

(2). 启动项目

python manage.py runserver

3. 初识Django应用

(1). Django应用

一个Django项目包含一组配置和若干个Django应用

一个Django项目就是一个基于Django的Web应用

一个Django应用就是一个可重用的Python软件包

每个应用可以自己管理模型、视图、模板、路由和静态文件等

应用可以重复包含

(2). 创建应用

python manage.py startapp 应用名称

(3). 应用目录

文件作用
views.py视图处理
models.py定义应用模型
admin.py定义模块管理
apps.py声明应用
tests.py编写测试用例
urls.py(自行创建) 管理应用路由

4. Django视图

使用Django视图编写 hello world 函数

1). 在Django应用的views.py文件中创建视图函数

首先要导入模块

from django.http import HttpResponse


def helloWorld (request):
    return HttpResponse('hello world')

2). 应用层面的路由配置: 在Django应用的urls.py文件中 配置路由绑定试图函数和url

这是配置应用层面的路由

import 应用名称.views

from django.urls import path


urlpatterns = [
    # 配置应用路由
    path('hello_world', 应用名称.views.helloWorld),
]

3). 项目层面的路由配置: 在Django项目的urls.py文件中 配置路由绑定试图函数和url

这是配置项目层面的路由

urlpatterns = [
    ...
    # 配置项目
    path('映射url/', include('应用名称.urls'))
    ...
]

4). 将应用添加到Django配置文件中

INSTALLED_APPS = [
    ...
    '应用名称.apps.XXXConfig',
]

4. Django模型层

1. 什么是模型层

位于Django视图层和数据库之间, 用于将Python对象和数据库表之间的转换

模型层作用:

  • 屏蔽不同数据库之间的差异
  • 让开发者更加专注于业务逻辑的开发
  • 提供了很多便捷的工具有利于开发

2. 模型层数据库配置

在Django项目的setting.py文件中

DATABASES = 
    'default': 
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    

修改成mysql数据库

DATABASES = 
    'default': 
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '数据库名称',
        'USER': '用户名',
        'PASSWORD': '密码',
        'HOST': '',
        'PORT': '端口号'
    

3. 模型层例子

(1). 模型层定义字段

自增类型
自增类型作用
AutoField主键自增
BigAutoField更大长度的主键自增
二进制和布尔类型
二进制和布尔类型作用
BinaryField二进制
BooleanField布尔类型
NullBooleanField不能为空的布尔类型
整数类型
整数类型作用长度
PostitiveSmallIntegerField正整数5字节
SmallIntegerField整数6字节
PostitiveIntegerField正整数10字节
IntegerField整数11字节
BigIntegerField整数20字节
字符和文本类型
字符和文本类型数据库对应类型
CharFieldvarchar
TextFieldlongText
时间类型
时间类型作用数据库类型
DateField年月日
DateTimeField年月日时分秒
DurationFieldPython timedeltaint类型
浮点类型
浮点类型作用
FloatField小数
DecimalField小数
其他类型
其他类型作用
EmailField邮箱
ImageField图片
FileField文件
FilePathField文件路径
URLFieldurl路径
UUIDFielduuid
GenericIPAdressFieldip地址
关系类型
关系类型作用
OneToOneField一对一
ManyToManyField多对多
ForeignKey多对一或一对多

(2). 字段参数

所有字段共有参数
参数作用取值
db_column指定数据库表中对应字段str
primary_key主键boolean
verbose_name备注或别名str
unique字段唯一boolean
null数据库中字段是否允许空boolean
blank表单提交时是否允许为空boolean
db_index设置索引boolean
help_text表单显示帮助信息str
editable用户是否可以更改boolean
个别字段参数
拥有字段参数作用取值
CharFieldmax_length指定最大长度int
日期类型unique_for_date日期是否唯一boolean
日期类型unique_for_month日期月份是否唯一boolean
日期类型unique_for_year日期年份是否唯一boolean
日期类型auto_now更新记录的时间boolean
日期类型auto_now_add增加记录时的时间boolean
DecimalFieldmax_digits数字个数int
DecimalFielddecimal_places小数个数int
关系型字段参数
拥有字段参数作用取值
OneToOneFieldrelated_name外键关联的反向查询str
ForeignKeyon_delete级联操作指定值

models.CASCADED 级联删除

models.PROTECT 需要先删除关联数据, 才可以删除当前数据

models.SET_NULL 关联数据置空 null = True, blank = True

models.SET_DEFAULT 关联字段值为默认值

models.SET_NOTHING 啥也不做

models.SET() 传递一个值或一个函数的返回值

自关联

一个数据库中的字段关联另一个数据库中的某一字段

地址表中, 地址的字段关联地址

from django.db import models

class AddressInfo(models.Model):
    address = models.CharField(max_length=200, null=True, blank=True, verbose_name="地址")
    pid = models.ForeignKey('self', null=True, blank=True, verbose_name="自关联")
    # pid = models.ForeignKey('AddressInfo', null=True, blank=True, verbose_name="自关联")

    def __str__(self):
        return self.address

(3). 设计博客模型层

在Django应用的models.py文件中定义模型

from django.db import models


class Article(models.Model):
    # 文章Id
    articleId = models.AutoField(primary_key=True)
    # 文章标题
    title = models.TextField()
    # 文章摘要
    briefContent = models.TextField()
    # 文章内容
    content = models.TextField()
    # 文章发布日期
    publishDate = models.DateTimeField(auto_now=True)

    # admin中显示
    def __str__(self) :
        return self.title

(4). 模型迁移

python manage.py makemigrations

生成数据库要执行的内容到migrations文件夹下

python manage.py migrate

执行migrations文件夹下的文件, 并将过程记录到django_migrations数据表中(该表是django自动生成的)

python manage.py makemigrations

python manage.py migrate 

(5). 注册模型到admin

在应用的admin.py文件中配置

from django.contrib import admin

from .models import Article

admin.site.register(Article)

(6). 模型迁出

将数据库转成models

python manage.py inspectdb > models.py

模型类代码会出现在models.py文件中

(7). 模型删除

1). 删除models.py文件中的模型类代码
2). 删除模型类在migrations文件夹下的对应文件
3). 删除django_migrations表中的记录
4). 删除模型类对应的数据表

4. 初识 Django Shell

1. 什么是 Django Shell

Python Shell是用于交互式的Python编程

Django Shell是用于交互式的Django项目环境

2. 为什么使用 Django Shell

  1. 临时性操作使用Django Shell更加方便
  2. 小范围Debug更简单,不需要运行整个项目来测试

3. 使用 Django Shell

(1). 进入 Django Shell

python manage.py shell

(2). 使用Django Shell导入数据

新建文章

from testapp1.models import Article
a = Article()
a.title = 'Test Django Shell'
a.brief_content = 'Mzy'
a.content = 'Test new Article'
# 存储数据库
a.save()
# 取出全部数据
articles = Article.objects.all()
article = articles[0]

5. 初识 Django Admin

(1). 什么是 Django Admin

Django框架的后台管理工具

可以读取定义的模型元数据, 提供强大的管理使用页面

(2). 为什么使用 Django Admin

  1. 方便添加数据
  2. 管理页面

(3). 使用 Django Shell

1). 创建管理员用户

python manage.py createsuperuser

2). 登录进入管理系统

访问admin

6. 初识 Django 模板系统

模板系统的表现形式是文本

1. 基本语法

标签作用
变量变量标签
% for x in list %, % endfor %for循环标签
% if %, % else %, % endif %if-else标签
% load static %使用静态文件, 自动查找static目录
% csrf_token %跨域

2. 使用模板系统

在应用的views.py文件写视图

使用render返回html页面, 默认去应用的templates文件夹里找

def getIndexPage(request):
    articles = Article.objects.all()
    return render(request, 'index.html', 
        # 左边是模板变量, 右边是把值赋予的变量
        'articles': articles
    )

在应用的urls.py文件配置路由

urlpatterns = [
    # 配置应用路由
    path('hello_world', testapp1.views.helloWorld),
    path('getArticle', testapp1.views.getArticle),
    path('index', testapp1.views.getIndexPage),
    path('detail', testapp1.views.getDetailPage),
]

3. 获取url路径参数

urlpatterns = [
    path('detail/<int:articleId>', testapp1.views.getDetailPage)
]
def getDetailPage(request, articleId):
    articles = Article.objects.all()
    article = None
    for i in articles:
        if i.articleId == articleId:
            article = i
            break
    return render(request, 'detail.html', 
        'article': article
    )

6. 初识 Django ORM

(1). ORM

Object Relational Mapping

(2). 配置数据库

setting.py文件中配置

DATABASES = 
    'default': 
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'PythonTest',
        'USER': 'root',
        'PASSWORD': 'xxx',
        'HOST': 'xxx',
        'PORT': 'xxx'
    

安装mysqlclient

pip install mysqlclient

安装PyMySQL

pip install PyMySQL

(3). 元数据

from django.db import models

class AddressInfo(models.Model):
    address = models.CharField(max_length=200, null=True, blank=True, verbose_name="地址")
    pid = models.ForeignKey('self', null=True, blank=True, verbose_name="自关联")
    # pid = models.ForeignKey('AddressInfo', null=True, blank=True, verbose_name="自关联")

    def __str__(self):
        return self.address
    
    class Meta:
        # 设置表名
        db_table = 'address'
        # 设置排序字段
        ordering = [
            'pid'
        ]
        # 设置表备注
        verbose_name = '地址信息'
        verbose_name_plural = verbose_name
        # 指定数据表是不是抽象的, 抽象的不生成数据表, 只用来继承
        abstract = False
        # 设置权限
        permissions = (
            ('权限', '说明'),
        )
        # 是否按照Django管理模式管理该表
        managed = True
        # 联合约束
        unique_together = (
            (), ()
        )
        # 设置模型类所属应用
        app_label = 'testapp1'
        # 定义数据库表空间
        db_tablespace = ''

(4). 实战建表

讲师信息表 课程信息表 学生信息表 助教信息表

助教和讲师是一对一

课程和讲师是多对一

学生信息和课程是多对多

讲师和课程 讲师是父表, 课程是子表

课程和学生 课程是父表, 学生是子表

讲师和助教 讲师是父表, 助教是子表

1). 讲师表

from django.db import models

class Teacher(models.Model):
    # 昵称
    nickname = models.CharField(
        max_length = 30,
        primary_key = True,
        db_index = True,
        verbose_name = "昵称"
    )
    # 个性签名
    introduction = models.TextField(
        default = "这位同学很懒, 木有签名~",
        verbose_name = "个性签名"
    )
    # 粉丝数
    fans = models.PositiveIntegerField(
        default = 0,
        verbose_name = "粉丝数"
    )
    # 用户创建时间
    createTime = models.DateTimeField(
        auto_now_add = True,
        verbose_name = "创建时间"
    )
    # 用户信息修改时间
    updateTime = models.DateTimeField(
        auto_now = True,
        verbose_name = "修改时间"
    )

    class Meta:
        verbose_name = "讲师信息表"
        verbose_name_plural = verbose_name

2). 课程表

from django.db import models

class Course(models.Model):
    """课程信息表"""
    # 课程名
    title = models.CharField(
        max_length = 100,
        primary_key = True,
        db_index = True,
        verbose_name = "课程名"
    )
    # 课程类型
    type = models.CharField(
        choices = (
            (1, "实战课"), (2, "免费课"), (3, "其他")
        ),
        max_length = 1,
        default = 0,
        verbose_name = "课程类型"
    )
    # 价格
    price = models.PositiveIntegerField(
        verbose_name = "价格"
    )
    # 销量
    volume = models.PositiveBigIntegerField(
        verbose_name = "销量"
    )
    # 上线时间
    createTime = models.DateTimeField(
        auto_now_add = True,
        verbose_name = "上线时间"
    )
    # 更新时间
    updateTime = models.DateTimeField(
        auto_now = True,
        verbose_name = "更新时间"
    )
    
        # 设置外键关联
    teacher = models.ForeignKey(
        Teacher, 
        # 删除级联
        on_delete = models.CASCADE, 
        null = True,
        blank = True,
        verbose_name = "课程讲师"
    )

    class Meta:
        verbose_name = "课程信息表"
        verbose_name_plural = verbose_name

    def __str__(self):
        return f"self.get_type_display()-self.title"

get_XXX_display()函数获取字段

例如, 如果如下类型字段存储的是1, 使用该函数后, 获得1所对应的值, 这里字段使用choice是数据库枚举类型

    type = models.CharField(
        choices = (
            (1, "实战课"), (2, "免费课"), (3, "其他")
        ),
        max_length = 1,
        default = 0,
        verbose_name = "课程类型"
    )

F运算符即format函数简化版, 3.6版本新加入的

原版

>>> a = "-"
>>> a.format("1", "2")
'1-2'

简化版

>>> a = 1
>>> b = 2
>>> c = f"a-b"
print(c)
1-2

f"self.get_type_display()-self.title"

相当于

"-".format(self.get_type_display(), self.title)

3). 学生信息表

from django.db import models

class Student(models.Model):
    """学生信息表"""
    # 昵称
    nickname = models.CharField(
        max_length = 30,
        primary_key = True,
        db_index = True,
        verbose_name = "昵称"
    )
    # 年龄
    age = models.PositiveSmallIntegerField(
        verbose_name = "年龄"
    )
    # 性别
    gender = models.CharField(
        choices = (
            (1, "男"), (2, "女"), (0, "保密")
        ),
        max_length = 1,
        default = 0,
        verbose_name = "性别"
    )
    # 学习时常
    fans = models.PositiveIntegerField(
        default = 0,
        verbose_name = "学习时常"
    )
    # 用户创建时间
    createTime = models.DateTimeField(
        auto_now_add = True,
        verbose_name = "创建时间"
    )
    # 用户信息修改时间
    updateTime = models.DateTimeField(
        auto_now = True,
        verbose_name = "修改时间"
    )
    
    # 设置外键关联
    course = models.ManyToManyField(
        Course,
        verbose_name = "课程"
    )

    class Meta:
        verbose_name = "学生信息表"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.nickname

以上是关于学习 Python Django的主要内容,如果未能解决你的问题,请参考以下文章

学习总结(北航助教陈彦吉)

助教学习总结

java JDK8 学习笔记——助教学习博客汇总

1-4 李宏毅2021春季机器学习教程-PyTorch教学-助教许湛然

2019春季助教学期总结

助教体会