挑战全网最全之django系列

1、django介绍

Django,是用python语言写的开源web开发框架

采用MVT模式:
M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理。
V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回应答。
T全拼为Template,与MVC中的V功能相同,负责封装构造要返回的html

2、工程搭建

1、环境准备(创建虚拟化工程)
cd /opt/devops
virtualenv venv -p python3
source venv/bin/activate
pip install django==2.0


扩展:

生成requirements.txt文件
pip freeze > requirements.txt
安装requirements.txt依赖
pip install -r requirements.txt

2、创建一个项目
django-admin startproject devops

devops/
-- manage.py              // 一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互
-- devops
	-- __init__.py          //一个空文件,告诉Python该目录是一个Python包
	-- settings.py          //该Django项目的配置文件
	-- urls.py                  //该Django项目的 URL 声明
	-- wsgi.py              //一个WSGI兼容的Web服务器的入口

3、指定ip与端口起动服务
python manage.py runserver 0.0.0.0:8000

4、创建一个app
python manage.py startapp app1

app1/                      
├── admin.py          //文件跟网站的后台管理站点配置相关
├── apps.py          //文件用于配置当前子应用的相关信息
├── __init__.py       
├── migrations       //目录用于存放数据库迁移历史文件
│   └── __init__.py
├── models.py         //文件用户保存数据库模型类
├── tests.py          //文件用于开发测试用例,编写单元测试
└── views.py          //文件用于编写Web应用视图

激活app

INSTALLED_APPS = (
……
'app1.apps.App1Config',
)

3、django配置


//配置数据库
DATABASES = {
	'default': {
		'ENGINE': 'django.db.backends.mysql',
		'NAME': 'devops',
		'USER': 'root',
		'PASSWORD': '123456',
		'HOST': '127.0.0.1',
		'PORT': 3306,
	}
}

//本地语言与时区
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'

//将app放入apps目录内(个人习惯)
import sys, os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))

//配置访问控制
ALLOWED_HOSTS = ["*"]

4、ORM

django中内嵌了ORM框架,不需要直接面向数据库编程,而是定义模型类,通过模型类和对象完成数据表的增删改查操作。

使用django进行数据库开发的步骤如下:

1、配置数据库连接信息
2、在models.py中定义模型类
3、迁移
4、通过类和对象完成数据增删改查操作

4.1 配置数据库连接信息

1、在settings.py配置数据库连接信息

2、使用MySQL数据库首先需要安装驱动程序
pip install PyMySQL

3、在Django的工程同名子目录的__init__.py文件中添加如下语句
from pymysql import install_as_MySQLdb
install_as_MySQLdb()

4.2 定义模型类

创建应用booktest,在models.py 文件中定义模型类

实例:

from django.db import models

#定义图书模型类BookInfo
class BookInfo(models.Model):
    btitle = models.CharField(max_length=20, verbose_name='名称')
    bpub_date = models.DateField(verbose_name='发布日期')
    bread = models.IntegerField(default=0, verbose_name='阅读量')
    bcomment = models.IntegerField(default=0, verbose_name='评论量')
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')

    class Meta:
        db_table = 'tb_books'  # 指明数据库表名
        verbose_name = '图书'  # 在admin站点中显示的名称
        verbose_name_plural = verbose_name  # 显示的复数名称

    def __str__(self):
        """定义每个数据对象的显示信息"""
        return self.btitle

#定义英雄模型类HeroInfo
class HeroInfo(models.Model):
    GENDER_CHOICES = (
        (0, 'female'),
        (1, 'male')
    )
    hname = models.CharField(max_length=20, verbose_name='名称') 
    hgender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')  
    hcomment = models.CharField(max_length=200, null=True, verbose_name='描述信息') 
    hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书')  # 外键
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')

    class Meta:
        db_table = 'tb_heros'
        verbose_name = '英雄'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.hname
4.2.1 关于主键

django会为表创建自动增长的主键列,属性为id。每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列。

4.2.2 字段类型

在这里插入图片描述

4.2.2 选项

在这里插入图片描述

4.2.3 多表实例

表与表之间的关系可分为以下三种:

  • 一对一: 一个人对应一个身份证号码,数据字段设置 unique。
  • 一对多: 一个家庭有多个人,一般通过外键来实现。
  • 多对多: 一个学生有多门课程,一个课程有很多学生,一般通过第三个表来实现关联。

参考资料:
多对多:https://blog.csdn.net/momoda118/article/details/121366803

表结构
书籍表 Book:title 、 price 、 pub_date 、 publish(外键,多对一) 、 authors(多对多)

出版社表 Publish:name 、 city 、 email

作者表 Author:name 、 age 、 au_detail(一对一)

作者详情表 AuthorDetail:gender 、 tel 、 addr 、 birthday
---------------------------------------------------------------------
class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    pub_date = models.DateField()
    # 外键在一对多的多中设置
    publish = models.ForeignKey("Publish", on_delete=models.CASCADE)
    # 多对多
    authors = models.ManyToManyField("Author")


class Publish(models.Model):
    name = models.CharField(max_length=32)
    city = models.CharField(max_length=64)
    email = models.EmailField()


class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.SmallIntegerField()
    # 一对一
    au_detail = models.OneToOneField("AuthorDetail", on_delete=models.CASCADE)


class AuthorDetail(models.Model):
    gender_choices = (
        (0, "女"),
        (1, "男"),
        (2, "保密"),
    )
    gender = models.SmallIntegerField(choices=gender_choices)
    tel = models.CharField(max_length=32)
    addr = models.CharField(max_length=64)
    birthday = models.DateField()
4.2.4 迁移

1)生成迁移文件
python manage.py makemigrations

2)同步到数据库中
python manage.py migrate

4.3 数据库操作

Django的manage工具提供了shell命令,帮助我们配置好当前工程的运行环境(如连接好数据库等),以便可以直接在终端中执行测试python语句
python manage.py shell

4.3.1 增加(两种方法)

>>> hero = HeroInfo(
    hname='孙悟空',
    hgender=0,
    hbook=book)
>>> hero.save()

>>> HeroInfo.objects.create(
    hname='沙悟净',
    hgender=0,
    hbook=book
)

2、查询


4.3.1 查询
1、查询所有、查询数量
>>> BookInfo.objects.all()
>>> BookInfo.objects.count()

2、过滤查询
>>> BookInfo.objects.filter(id=1)
>>> BookInfo.objects.filter(btitle__contains='传')

3、比较查询
>>> BookInfo.objects.filter(id__gt=3)  
gt 大于 (greater then)
gte 大于等于 (greater then equal)
lt 小于 (less then)
lte 小于等于 (less then equal)

4、Q对象查询,如果需要实现逻辑或or的查询,需要使用Q()对象结合|运算符,Q对象被义在django.db.models中
BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))

5、聚合函数,聚合函数包括:Avg 平均,Count 数量,Max 最大,Min 最小,Sum 求和,被定义在django.db.models中
BookInfo.objects.aggregate(Sum('bread'))

6、排序
BookInfo.objects.all().order_by('-bread')  # 降序

7、关联查询
b = BookInfo.objects.get(id=1)
b.heroinfo_set.all()            //一对多
b.hbook                        //多到一
4.3.1 修改
1、保存
hero = HeroInfo.objects.get(hname='猪八戒')
hero.hname = '猪悟能'
hero.save()

2、更新
HeroInfo.objects.filter(hname='沙悟净').update(hname='沙僧')
4.3.1 删除
hero = HeroInfo.objects.get(id=13)
hero.delete()

HeroInfo.objects.filter(id=14).delete()

5、路由

path:用于普通路径,不需要自己手动添加正则首位限制符号,底层已经添加。
re_path:用于正则路径,需要自己手动添加正则首位限制符号。

from django.urls import re_path # 用re_path 需要引入
urlpatterns = [
	# 普通路径
    path('index/', views.index), 
    # 正则路径
    re_path(r'^articles/([0-9]{4})/$', views.articles), 
    # 正则路径中的有名分组(?P<组名>正则表达式)
    re_path("^index/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$", views.index) 
    #路由分发,让每个app目录都单独拥有自己的 urls。
    path("app01/", include("app01.urls")),
]

6、权限控制

6.1 jwt

请求需要带上请求头去访问
在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值