当前位置: 首页 > 工具软件 > django-less > 使用案例 >

python 虚拟环境 django.db 报错_Django-笔记

能翔宇
2023-12-01

Django 框架

1、软件框架:是由其中的各个软件模块组成的,每一个模块都有特定的功能

2、MVC 框架:

产生理念:分工,让专门的人去做专门的事

核心思想:解耦

M:Model 模型 和数据库进行交互

V:View 视图 产生html 页面

C:Controller 控制器,接受请求,进行处理,与 M 和 V 交互返回答应

3、MVT

M:Model 模型

V: View 视图(和 MVC 中 c 相同,)

T: Temlate 模板 (和MVC中V相同,产生html页面)

快速开发 和DRF 原则

4、虚拟环境

虚拟环境是真是python 环境的复制环境

创建虚拟环境命令(mkvirtualenv 虚拟环境名)

创建python3 虚拟环境:mkvirtualenv -p python3 bj11_py3

进入虚拟环境工作:workon 虚拟环境名

查看机器上有多少个虚拟环境:workon 空格 + 两个tab键

退出虚拟环境:deactivate

删除虚拟环境:rmvirtualenv 虚拟环境名

pip list(查看安装的包)

pip install 包(==版本号)

pip freeze

5、项目创建

1、安装django(用命令行添加)

2、在D:\python\python374\Scripts 路径下的命令行 输入django-admin startproject test1

3、目录就创建在D:\python\python374\Scripts

目录包括:

__init__.py:说明test1 是一个python包

setting.py: 项目的配置文件

urls.py: 进行url路由的配置

wsgi.py:web 服务器和Django交互的入口

manage.py: 项目的管理文件

(在目录中使用命令行:python manage.py startapp booktest)

Django 开发中一个模块一个应用

__init__.py:说明目录是一个python 模块

models.py: 写和数据库相关的内容

views.py: 定义处理函数,视图函数

tests.py: 写测试代码的文件

admin.py: 网站的后台管理文件

建立应用和项目之间的练习,需要对应用进行注册

在test 文件下的settings.py 中 INSTALLED_APPS 列表后面添加

'booktest', #进行应用的注册

运行开发web服务器命令:

python manage.py runserver(如果有报错请执行 python manage.py migrate)

6、ORM

O:Object 对象类

R:Relations 关系、数据库中表

M:Mapping: 映射

ORM 另外一个作用:根据设计的类生成数据库中的表

模型类生成表

1) 生成迁移文件

命令: python manage.py makemigrations

2) 执行迁移生成表

命令:python manage.py migrate

3) 通过模型类操作数据表

命令:python manage.py shell

然后通过实例化操作数据

from booktest.models import BookInfo

b = BookInfo() # 实例化

b.btitle = '天龙八部'

from datetime import date

b.bpub_date = date(1990,1,1)

b.save() # 保存

# 查询

b2 = BookInfo.objects.get(ID=1)# 查找ID = 1的数据

type(b2)

b2.title # 查看列

b2.bpub_date

# 修改数据

b2.bpub_date= date(1990,10,10)

b2.save()

#删除

b2.delete()

设置外键

hbook = models.ForeignKey(to='BookInfo', on_delete=models.CASCADE)

如何查看跟一本图书关联的

b.heroinfo_set.all()#小写, 由一查多

h.hbook #由多查一

BookInfo.objects.all() # 查询图书表里面的所有内容

后台管理

1)本地化--语言和时区的本地化, 修改项目的settings.py

age: LANGUAGE_CODE = 'en-us' -->LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'UTC' -->TIME_ZONE = 'Asia/Shanghai'

2)创建管理员

命令:python manage.py createsuperuser

然后输入:

用户名:fu

电子邮箱:1024238316@qq.com

密码:fu13460517032

然后启动服务器(命令):python manage.py runserver

3)注册模型类

在应用下的admin.py 中注册模型类

告诉Django 框架 根据注册的模型类来生成对应的表管理页面

b = BookInfo()

#修改显示的内容 在models下添加函数

def __str__(self):

# 返回书名

return self.hname

4、自定义管理页面(admin)

自定义模型管理类:告诉Django 在生成的管理页面上显示那些内容

--------上面是M------------

--------下面是V------------

视图:在Django 中,通过浏览器去请求一个页面时,使用视图函数来处理这个请求,

视图函数处理之后,要给浏览器返回这个页面的内容

视图函数的使用:

1)定义视图函数:视图函数定义在view.py 中

def index2(request):

# 进行处理,和M 和T进行交互

return HttpResponse('Hello, python!')

视图函数必须有一个参数 ruquest, 进行处理之后,需要返回一个HttpResponse雷的对象,Hello, python!就是返回给显示器的内容

2)进行url 配置

urlpatterns = [url(r'^index$', views.index), # 建立/index 和视图之间的关系

url(r'^index2$', views.index2),]

一、所有的url配置项都定义在一个叫做urlpatterns的列表中

二、每一个配置项都会调用url函数,第一个参数是正则表达式,第二个参数是对应的处理动作,可以写一个视图函数的名字

三、和url字符串进行正则匹配,匹配成功则执行其后对应的处理动作

四、工作对应的动作可以是一个视图函数的名字,也可以是包含一个应用的urls.py

url 匹配过程

在项目的url.py 文件中包含具体应用的urls.py 文件,应用的 url.py 文件中写url 和视图函数的对应关系

模板

模板:不仅仅是一个html 文件

模板文件的使用

1)创建模板文件夹(在根目录中创建 Directory 文件夹,命名为 templates)

2)配置模板目录(在settings中TEMPLATES--> 'DIRS': [os.path.join(BASE_DIR, 'templates')], # 设置目录)

3)只用模板文件

a) 加载模板文件

去模板目录下面获取html文件的内容,得到一个模板对象

b)定义模板上下文

向模板文件传递数据

c)模板渲染

得到一个标准的html内容

给模板文件传递数据

模板变量使用:{{模板变量名}}

模板代码段:{%代码段%}

for 循环:

{%for i in list%}

{{i}}

{% endfor %}

模型M:

1、Django ORM

2、Django 数据库配置

2.1 mysql 命令回顾

登入mysql 数据库:mysql -uroot -p

查看有哪些数据库:show databases

创建数据库:create database test2 charset=utf8; # 切记:指定编码

使用数据库:use test2;

查看数据库中的表: show tables;

2.2 Djanogo 配置使用 mysql 数据库

修改 settings.py 中的DATABASES

DATEBASES = {

'default':{

#'ENGINE': 'django.db.backends.sqlite3',

'ENGINE': 'django.db.backends.mysql', #使用mysql 数据库

#'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),

'NAME': 'test2', # 使用的数据库名字

'USER': 'root', # mysql数据库的用户名

'PASSWORD':'root', #数据库的登入密码

'HOST':'localhost', '数据库所在主机'

'PORT':3306, #数据库端口号

}

}

# 在python3 中需要安装pymysql

# 安装之后,需要在test2/__init__.py 中加如下内容:

import pymysql

pymysql.install_as_MySQLdb()

# 模型 M

# 1、 在Django的安装目录(D:\python\python374\Scripts)下打开命令行

# 输入django-admin startproject test2 #test2为项目名

# 2、在新建的test2 目录(D:\python\python374\Scripts\test2)下打开命令行

# 输入python manage.py startapp booktest #booktest 为应用

# 3、用pycharm 打开我们新建的项目--> 在项目名中setting 添加注册应用 和修改数据库

# INSTALLED_APPS 中添加 'booktest', #注册应用

# DATABASES 中更改数据库如下:(默认为SQLite)

# DATABASES = {

# 'default': {

# # 'ENGINE': 'django.db.backends.sqlite3',

# 'ENGINE': 'django.db.backends.mysql',

# #'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),

# 'NAME': 'fu', # 使用数据库的名字

# 'USER':'root', #链接mysql的用户名

# 'PASSWOED':'', #用户对应的密码

# 'HOST':'localhost', #指定mysql 数据库所在电脑IP

# 'PORT':3306, # mysql 服务

# }

# }

# 4、在test2中__init__.py 文件下添加

# import pymysql

# pymysql.install_as_MySQLdb()

# 5、在模型 booktest->migrations->models.py 中声明类(如下):

'''

class BookInfo(models.Model):

#图书模型类

# 图书名称

btitle = models.CharField(max_length=20)

# 出版日期

bpub_date = models.DateField()

# 阅读量

bread = models.BooleanField(default=False)

# 评论量

bcomment = models.IntegerField(default=0)

# 删除标记

isDelete = models.BooleanField(default=False)

# 多类

class HeroInfo(models.Model):

#英雄人物模型

# 英雄名

hname = models.CharField(max_length=20)

# 性别

hgender = models.BooleanField(default=False)

# 备注

hcomment = models.CharField(max_length=200)

# 关系属性

hbook = models.ForeignKey('BookInfo')

# 删除标记

isDelete = models.BooleanField(default=False)

'''

# 注释 如果有报错 请把关系属性改为 hbook = models.ForeignKey(to='BookInfo', on_delete=models.CASCADE)

# 6、 在命令行中执行

# python manage.py makemigrations #生成迁移文件,在booktest->migrations 下方

# python manage.py migrate #根据迁移文件生成迁移表,(在mysql 数据库对应的库中可以查看)

'''

可以在把下面的语句在数据库执行

insert into booktest_bookinfo(btitle, bpub_date, bread, bcomment, isDelete)

values('射雕英雄传', '1980-5-1', 12, 34, 0),

('天龙八部', '1986-7-24', 36, 40, 0),

('笑傲江湖', '1995-12-24', 20, 80, 0),

('雪山飞狐', '1987-11-11', 58, 24, 0);

insert into booktest_heroinfo

(hname, hgender, hbook_id, hcomment, isDelete)

values('郭靖', 1,1,'降龙十八掌',0),

('黄蓉', 0,1,'打狗棍法', 0),

('黄药师', 1,1,'弹指神通', 0),

('欧阳锋', 1,1,'蛤蟆功', 0),

('梅超风', 0,1,'九阴白骨抓', 0),

('乔峰', 1,2,'降龙十八掌', 0),

('段誉', 1,2,'六脉神剑', 0),

('虚竹', 1,2,'天山六阳掌', 0),

('王语嫣', 0,2,'神仙姐姐', 0),

('令狐冲', 1, 3,'独孤九剑', 0),

('任盈盈', 0, 3,'弹琴', 0),

('岳不群', 1, 3,'华山剑法', 0),

('东方不败', 0, 3,'葵花宝典', 0),

('胡斐', 1, 4,'花胡家刀', 0),

('苗诺兰', 0, 4,'黄衣', 0),

('程灵素', 0, 4,'医术', 0),

('袁紫衣', 0, 4,'六合拳', 0);

'''

# 7、添加模板,在test2下添加templates 文件夹,并且在tests2中settings 中TEMPLATES中

# 修改:'DIRS': [os.path.join(BASE_DIR, 'templates')],

# 为了方便管理在templates下再新建一个模块booktest里面放置html模板

# 8、在booktest->views 中定义一个视图

def index(request):

'''显示图书信息'''

# 1、查看所有的图书信息

books = BookInfo.objects.all()

# 2、使用模板

return render(request, 'booktest/index.html', {'books': books})

# 9、配置url

# 在test2 中添加

# url(r'^', include('booktest.url')) # 包含booktest的应用文件

# 10、在booktest中新建url.py

# from django.conf.urls import url

# from booktest import views

# urlpatterns = [

# url(r'^index$', views.index), # 包含booktest的应用文件

# ]

# 运行时报错,版本不一样,找到Django (D:\python\python374\Lib\django\db\backends\mysql)中的base.py

# 修改为

if version < (1, 3, 3):

raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)

# 继续改为operations.py中的

# if query is not None:

# query = query.encode(errors='replace')

# return query

# 如果还是报错,看看报错的位置的进行修改(我的第二次报错位置为 D:\python\python374\Lib\django\db\backends\mysql)

'''

# 字段属性和选项

模型类属性命名限制:

1)不能是python 的保留关键字

2)不允许使用连续的下划线

3)定义属性时需要制定字段类型,通过字段类型的参数制定选项(属性名=models.字段类型(选项))

字段类型(使用时需要引用django.db.models)

1)AutoField: 自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性

2)BooleanField: 布尔字段,值为True 或False

3)NullBooleanField: 支持Null、True、False 三种值

4)CharField(max_length=最大长度):字符串,参数max_length 表示最大字符个数

5)TextFiled:大文本字符串,一般超过4000个字符使用

6)IntegerField:整数

7)DecimalField(max_digits=None,decimal_places=None):十进制浮点数(max_digits表示总位数,decimal_places表示小数位)

8)FloatField:浮点数,同上(上面更加精确)

9)DateField([auto_now=False, auto_now_add=False]):日期

auto_now:更新属性的时间

auto_now_add:自动设置创建时间

上面两个只能同时用一个

10)TimeField:时间,参数同上

11)DateTimeField:日期时间,参数同DateField

12)FileField:上传文件字段

13)ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片

选项:

1)default:默认值,设置默认值

2)primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用

3)unique:若为True,这个字段在表中必须有名唯一,默认值是False

4)db_index:若为True,则在表中会为此字段创建索引,默认值是False

5)db_column:字段的名称,如果没有指定,则使用属性的名称

6)null:如果为True,表示允许为空,默认值是False

7)blank:如果为True,则该字段允许为空白,默认值是False

注释:null 是数据库范畴的概念,blank 是后台管理页面表单验证范畴的

https://docs.djangoproject.com/zh-hans/2.1/

5.查询

配置mysql,让其产生日志文件(未能实现)

1、使用下面的命令打开mysql的配置文件,去除68、69行注释,然后保存

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

2、重启mysql 服务,就产生mysql 日志文件

sudo service mysql restart

3、打开MySQL 的日志文件

/var/log/mysql/mysql.log 是mysql 日志文件所在的位置

查询函数(通过模型类.objects属性)

函数名 功能 返回值 说明

get:返回表中满足条件的一条只能是一条数据 返回值是一个模型类的对象 查到多条数据会抛出异常MultipeObjectsReturned

查不到数据会抛出异常DoesNotExit

all:返回模型类中对应表格的所有数据 返回值是QuerySet 查询集

filter:返回满足条件的数据 返回值是QuerySet 参数写查询条件

exclude:返回不满足条件的数据 返回值是QuerySet 参数写查询条件

order_by:用于查询排序 返回值是QuerySet 参数中是根据那些字段进行排序

# .all().order_by('id') # 升序

# .all().order_by('-id') #降序

filter 方法:

a) 判等 条件名:exact(可以省略)

BookInfo.objects.filter(id__exact=1)

b) 模糊查询 (包含 contains、结尾 endwith、开头 startwith)

c) 空查询 isnull (字段名__isnull=False)

d) 范围查询 in (字段名__in = (1,3,5))# 元组列表都可以

e) 比较查询 gt(greate than) 大于 lt(less than) #(id__gt=3) 大于三

gte(equal) 大于等于 lte()

f) 日期查询 年 (字段名__year=1980)月month 日day

6、F对象

作用:用类属性之间的比较,

from django.db.models import F

BookInfo.objects.filter(bread__gt=F('comment') * 2)

7、Q对象

作用:用于查询时,条件之间的逻辑关系, not and or 可以对Q对象进行&|~

from django.db.models import Q

BookInfo.objects.filter(Q(id__gt=3)|Q(bread__gt=30))

8、集合函数

作用:用于查询结果进行集合操作 sum count avg max min

aggregate:调用这个函数来使用聚合(返回一个字典)

from django.db.models import Sum、Count、Avg、Max、Min

# BookInfo.objects.all().aggregate(Count('id')) #返回的结果{'id__count':5}

# BookInfo.objects.count() 和上面的代码结果一样,返回一个整数

9、查询集

返回集.exists() #查看返回集有没有数据

10、模型类关系

1)一对多 models.ForeignKey() #定义在多类

2)多对多 models.ManyToManyField() #定义在哪个类中都可以

3)一对一 models.OneToOneFile()定义在哪个类中都可以

11、关联查询(一对多)

由一查多

b=BookInfo.objects.get(id=1)

b.heroinfo_set.all()

例如:查询图书信息,要求图书关联的英雄的描述包含‘八’

BookInfo.object.filter(heroinfo__hcomment__contains='八')

由多查一

查看书名为'天龙八部的所有英雄'

HeroInfo.objects.filter(hbook__btitle='天龙八部')# hbook为外面的名字

通过模型类实现关联查询时,需查哪个表中的数据,就需要通过哪个类查询

写关联查询条件的时候,如果类中没有关系属性,条件需要对应类的名

如果类中有关系属性,直接写关系属性

12、插入、更新和删除

通过调用一个模型类对象的save方法的时候就可以实现对模型类对用数据表的插入和更新

通过调用一个模型类对象的delete 方法的时候就可以实现对模型类对用数据表的删除

13、自关联:一种特殊的一对多关系

14、管理类

BookInfo.objects.all()-->

objects 是Django 帮我自动生成的管理器对象,通过这个管理器对象可以实现对数据的查询

objects 是 models.Manager 类的一个对象,自己一旦定义了,Django就不在提供了

15、元选项

在定义表中添加

class Meta:

db_table = 'bookinfo'

作用:生成自己想要对用的表名

=======视图=============

1、视图的功能

接受请求,进行处理,与M和 T进行交互,返回应答

返回html 内容HttpResponse,也可能重定向redirect

2、视图函数使用

2.1 使用

1)定义视图函数

request 参数必须有,是一个HttpRequest 类对象,可以改但是不要改

2)配置url

建立url 和视图函数之间的对应关系

2.2 url配置过程

1)在项目的urls 文件中添加具体的urls文件,再具体应用的urls文件中包含具体的url和视图的对应关系

2)url 配置项是定义在一个名叫urlpatterns 的列表中,其中每一个元素就是一个配置项,每一个配置项都调用url函数

3、匹配过程

4、错误视图

404:找不到页面,默认会显示一个错误的标准页面,如果要自定义页面,在templates 目录下自定义一个404.html

a)url 没有配置

b)url 配置错误

500:视图出错

网站开发完成需要关闭调试模式,在settings.py 文件中:

DEBUG = False

ALLOWED_HOSTS = [*]

5、捕获url 参数

进行url 匹配时,把所需要的捕获的部分设置成一个正则表达式组,这样

Django框架就会自动把匹配成功后相应组的内容作为参数传递给视图函数

1)位置参数 # url(r'^showarg(\d+)$', views.show_arg)

参数名可以随意制定

2)关键字参数 # url(r'^showarg(?P\d+)$', views.show_arg)

参数名必须和正则表达式中的一样

6、普通登入案例

request 是HttpRequest 类型的对象

request 包含浏览器请求的信息

在请求的html 中

用户名:

密码:

给出接受的login_check视图

def login_check(request):

#登入校验视图

# request.POST 保存的是post方式提交的参数

# request.GET 保存的是get方式提交的参数

# 1、 获取提交的用户名和密码

username = request.POST.get('username')

password = request.POST.get('password')

print(username)

print(password)

# 2、 进行登入校验

if username == 'smart' and password == '123':

# 用户名密码正确

return redirect('/index')

else:

return redirect('/login')

并且配置url

7、ajax

新建static 文件,并且再新建js、css、images文件

ajax:异步的javascript

在不加载页面的情况下,对页面进行局部刷新

$.ajax({

'url':请求地址,

'type':请求方式,

'dataType':预期返回的数据格式,

'data':参数,

'async':false, //同步的设置,按照代码的顺序执行,默认异步不会等待服务器的返回结果继续执行代码

}).success(function(data){

//回调函数

})

示例:

ajax

$(function () {

// 绑定 btnAjax的click 事件

$('#btnAjax').click(function () {

$.ajax({

'url':'/ajax_handle',

'dataType': 'json'

}).success(function (data) {

//进行处理

// alert(data.res)

if (data.res == 1){

$('#message').show().html('提示信息')

}

})

})

})

#message{

display: none;

color: red;

}

定义ajax_handle视图,并且配置url

示例如下:

def ajax_handle(request):

# 返回ajax处理

# 返回json 数据

return JsonResponse({'res':1})

8、cookie 和 session

1)以键值对的格式写session

request.session['键'] = 值

2)根据键读取值

request.session.get('键', 默认值)

3)清楚所有session,在储存中删除值部分

request.session.clear()

4)清除session 数据,在储存中删除session的整条数据

request.session.flush()

5)删除session中的指定键及值,在储存中只删除摸个键及对应的值

del request.session['键']

6) 设置会话的超时时间,如果没有指定过期时间则两个星期后过期

request.session.set_expiry(value)

8.3 cookie和session的应用场景

cookie:记住用户名。安全性要求不高。

session:涉及到安全性要求比较高的数据。银行卡账户,密码

'''

'''

模板文件的使用

1、新建Django

1.1 使用pycharm--> File --> New Project --> Django -->选择:Location 和Application name 填写

1.2 设置数据库 和 __init__.py

2、在 template 中新建booktest 文件,在其中添加index.html

3、定义视图、配置url

'''

 类似资料: