Django对各种数据库提供了很好的支持,而且为很多数据库提供了统一的调用API,这些API统称为ORM框架。通过使用Django内置的ORM降价可以实现数据库操作。ORM框架是一种程序技术,用于实现面向对象编程语言中不同类型系统的数据之间的转换。从效果上说,其实是创建了一个可在编程语言中 使用的“虚拟对象数据库”,通过对虚拟对象数据库操作从而实现对膜表数据库的操作。两者是相互对象,虚拟对象数据库也称模型。
构建模型
具体实现操作过程:
1.配置目标书库信息,主要在settings.py设置数据库信息,具体操作查看:配置信息
2.构建虚拟对象数据库,在APP的models.py文件中一类的形式定义模型。
3.通过模型在目标数据库中创建相应的数据表。
4.在视图函数中通过对模型操作实现目标数据库的读写操作。
在项目index的models.py文件中定义模型,代码如下:
from django.db import models
# Create your models here.
# 创建产品分类表
class Type(models.Model):
id = models.AutoField(primary_key=True)
type_name = models.CharField(max_length=20)
# 创建产品信息表
lass Product(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=50)
weight = models.CharField(max_length=20)
size = models.CharField(max_length=20)
type = models.ForeignKey(Type, on_delete=models.CASCADE)
上述代码分别定义了模型Type和Product:
1.模型以类的形式进行定义,并且继承Django的models.Model类,一个类代表目标数据库的一张表。
2.模型的字段以类属性进行定义,如id = models.IntegerField(primary_key=True)代表在数据表Type中命名一个名为id的字段,该字段的数据类型为整型并设置为主键。
完成模型的定义后,接着在目标书库中穿件相应的数据表,在目标数据库中的创建表是通过Django的管理工具manage.py完成。创建数据表需要执行两次指令,分别是:
E:\Mydjango> python manage.py makemigrations
E:\Mydjango> python manage.py migrate
makemigrations指令用于将index所定义的模型生成0001initial.py文件,改文件存放在index的migrations文件夹。0001_initial.py文件将models.py的内容生成数据表的脚本代码,migrate指令是根据脚本代码在目标数据库中生成相对应的书库表。
数据库表关系
一个模型对应目标数据库的一个数据表,每个数据表之间是可以存在关联。表与表之间有三种关系:一对一,一对多,多对多。
# # 一对多关系#
class Performer(models.Model):
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=20)
nationality = models.CharField(max_length=20)
class Program(models.Model):
id = models.IntegerField(primary_key=True)
performer = models.ForeignKey(Performer,on_delete=models.CASCADE)
name = models.CharField(max_length=20)
# 一对多关系
class Performer(models.Model):
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=20)
nationality = models.CharField(max_length=20)
class Program(models.Model):
id = models.IntegerField(primary_key=True)
performer = models.ForeignKey(Performer,on_delete=models.CASCADE)
name = models.CharField(max_length=20)
# 多对多关系
class Performer(models.Model):
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=20)
nationality = models.CharField(max_length=20)
class Program(models.Model):
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=20)
performer = models.ManyToManyField(Performer)
数据库读写操作
数据的插入一般有两种方式:
# 方法一
>>> Product.objects.create(name='p30', weight='120g', size='120*75*8mm',type_id=1)
# 方法二
>>> Product(name='p30', weight='120g', size='120*75*8mm',type_id=1) .save()
数据的更新操作:
# 更新多条数据,查询条件filter以列表格式返回,查询结果可能是一条或多条数据
Product.objects.filter(name='p30').update(name='p40')
# 全表更新,不适用查询条件,默认对全表的数据进行更新
Product.objects.update(name='p50')
数据的删除三种操作:
# 删除表中全部数据
Product.objects.all().delete()
# 删除一条数据
Product.objects.get(id=5).delete()
#删除多条数据
Product.objects. filter(name='p30').delete()
查询条件get和filter的区别如下:
1.查询条件get:查询字段必须是主键或者唯一约束的字段,并且查询的数据必须存在,否则程序会抛出异常。
2.查询条件filter:查询字段没有限制,只要改字段是数据表的某一字段即可。查询结果以列表的形式返回。查询不到结果就返回空列表。
数据查询是数据库操作中最负责并且内容最多的部分,Django是如何通过ORM框架提供API实现数据查询的,代码如下:
>>> from index.models import *
# 全表查询
>>> p = Product.objects.all()
>>> p[1].name
"HUAWEI nova 2s"
# 查询前5条数据,SQL语句里面的limit方法在Django中使用Python的列表截去分解即可实现
>>> p = Product.objects.all()[:5]
# 查询某个字段,使用values方法,以列表形式返回数据,列表元素以字典格式表示
>>> p = Product.objects.values('name')
>>> p[1]['name']
"HUAWEI nova 2s"
# values_lists 方法以列表表示返回数据,列表元素以元组格式表示
>>> p = Product.objects.values_list('name')[:3]
>>> p
<QuerySet [('荣耀V10',), (' HUAWEI nova 2s ',), ('P30',)]>
# 使用get方法查询数据
>>> p = Product.objects.get(id=5)
>>> p.name
"HUAWEI nova 2s"
# and 查询,使用filter方法查询数据,注意区分get和filter的差异
>>> p = Product.objects. filter(name='P30', id=8)
>>> p
<QuerySet [<Product: Product object (9) >]>
# SQL的or查询,需要引入Q,编写格式: Q(field=value) | Q (field=value)
>>> from django.db.models import Q
>>> p = Product.objects.filter(Q(name='P30')|Q(id=8))
# 使用count方法统计查询数据
>>> p = Product.objects.filter(name='P30').count()
# 去重查询,distinct方法
>>> p = Product.objects.values('name').filter(name='P30').distinct()
# 降序排序,只需要在order_by里面的字段前面加-即可
>>> p = Product.objects. order_by('-id')