django文档总结之数据库操作-mysql(3)

模板使用

1 在templates文件夹里创建模板文件index.html

2 在模板文件中添加语法:<h1>{{ city }}</h1> 

3 模板渲染:定义视图函数,添加到urls.py中
from django.shortcuts import render

def index(request):

	context = {'city': '北京'}

	return render(request, 'index.html', context)

数据库准备

1 使用mysql数据库,在所用虚拟环境下先安装驱动程序 :

pip install PyMySQL

2 在同名子目录的__init__中添加语句 (让Django的ORM能以mysqldb的方式来调用PyMySql)

from pymysql import install_as_MySQLdb

install_as_MySQLdb()

3 修改DATABASES的配置信息

DATABASES = {

	'default': {

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

		'HOST': '127.0.0.1',  # 数据库主机

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

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

		'PASSWORD': 'mysql',  # 数据库用户密码

		'NAME': 'django_demo'  # 数据库名字

	}

}

4 在MySQL中创建数据库:

create database django_demo default charset=utf8;

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

定义图书模型类BookInfo

class BookInfo(models.Model):

	...

	属性名 = models.字段类型(选项)

	...

	# 自定义表信息,Meta是固定的

	class Meta:

	db_table = 'tb_book' # 定义表名(未定义时默认:小写app应用名_小写模型类名)

	verbose_name = '图书'  # 在admin站点中显示的名称

定义英雄模型类HeroInfo

class HeroInfo(models.Model):

	...

	# 外键:参数为类的名称

	book = models.ForeignKey('BookInfo')

	# models.Foreinkey()一对多

	# models.OneToOneField一对一

	# models.ManyToManyField多对多

	#隐含属性:book_id

	#book代表一个BookInfo类型的对象

	#book_id代表某个对象的主键值

	#默认创建的主键列属性为id,可以使用pk代替

6 数据库迁移

python manage.py makemigrations   # 生成迁移文件

python manage.py migrate     # 同步到数据库中(模板类如果属性改变,就需要同步)

7 在数据库中添加数据

insert into 表名(属性名1,属性名2...) values(对应值1,对应值2...)

数据库操作

class AddView(View):

	def get(self,request)

		return render(request,'add.html')

	def post(self,request)

		# 确定根据哪些属性增加

		dict1 = request.POST

		title = dict1.get('title')

		pub_date = dict1.get('pub_date')

		# 通过创建模型类对象,执行对象的save()方法保存到数据库中

		book = BookInfo()

		book.title = title

		book.pub_date = datetime.strptime(pub_date, '%Y-%m-%d')

		book.save()
		return redirect('/')  # 返回主页

class EditView(View):

	def get(self, request, pk):

		# 第一个pk表示类BookInfo中的属性的名称,表示主键

		# 第二个pk表示视图函数接收的参数pk

		book = BookInfo.objects.get(pk=pk)

		context = {'book': book}

		return render(request, 'edit.html', context)

	def post(self, request, pk):

		...获取要修改的属性值

		# 修改数据

		book = BookInfo.objects.get(pk=pk)

		book.title = title

		book.pub_date = datetime.strptime(pub_date, '%Y-%m-%d')

		book.save()

class DeleteView(View):

	def get(self, request, pk):

		...

	def post(self, request, pk):

		# 删除

		book = BookInfo.objects.get(pk=pk)

		book.delete()

一般查询

过滤

filter(过滤条件) 过滤出多个结果
exclude(过滤条件) 排除掉符合条件剩下的结果
get(过滤条件) 过滤单一结果

过滤条件:属性名__比较运算符=值

比较运算符:

  • exact(表判断),
  • contains(包含),
  • startswith,
  • endswith,
  • in(包含在),
  • gt(大于),
  • gte(大于等于),
  • lt(小于),
  • lte(小于等于)

对日期时间:year、month、day、week_day、hour、minute、second

F & Q

F(属性名)实现属性间比较:

BookInfo.objects.filter(bread__gte=F('bcomment'))

Q(属性名__运算符=值)实现逻辑与或非:BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))

聚合函数

  • Avg,
  • Count,
  • Max,
  • Min,
  • Sum:BookInfo.objects.aggregate(Sum('属性名'))

set与非set

已知book对象,获取所有对应的英雄对象,使用book.heroinfo_set.all()
已知英雄的条件,查询图书对象,使用heroinfo__属性__运算符=值

查询集QuerySet

blist = BookInfo.objects.all()

context = {

	'blist': blist

}

return render(request, 'index.html', context)

all():返回所有数据。
filter(条件):返回满足条件的数据。
exclude(条件):返回满足条件之外的数据。
order_by(属性):根据属性对结果进行升序(-降序)。

查询集两大特性:惰性缓存
优点:尽量减少与数据库交互的次数
使用场景:迭代判断序列化

管理器

在每个模型类中,默认有一个管理器,名称为objects

django支持开发人员自定义管理器

一旦自定义管理器,则不再有默认管理器objects

book=BookInfo.objects.create(属性)

book=BookInfo()

book.**=**

book.save()

posted on 2021-02-05 11:36  进击的davis  阅读(73)  评论(0编辑  收藏  举报

导航