查询数据层次图解:如果操作mysql,ORM是在pymysq之上又进行了一层封装。
ORM图示:
若想将模型转为mysql数据库中的表,需要在settings中配置:
#1) settings.py DATABASES = { 'default': { # 配置使用mysql 'ENGINE': 'django.db.backends.mysql', # 数据库产品 'HOST': "localhost", # 数据库ip 'PORT': 3306, # 数据库端口 'USER': "root", # 用户名 'PASSWORD': "123", # 密码 'NAME': "xxx", # 数据库名 } } ''' 'NAME': 要连接的数据库,连接前需要创建好 'USER': 连接数据库的用户名 'PASSWORD':连接数据库的密码 'HOST': 连接主机,默认本机 'PORT': 端口 默认3306 'ATOMIC_REQUEST': True, 设置为True统一个http请求对应的所有sql都放在一个事务中执行(要么所有都成功,要么所有都失败)。 是全局性的配置, 如果要对某个http请求放水(然后自定义事务),可以用non_atomic_requests修饰器 'OPTIONS': { "init_command": "SET storage_engine=MyISAM", } 设置创建表的存储引擎为MyISAM,INNODB ''' #2) 项目同名文件夹下的 __init__.py中 import pymysql pymysql.install_as_MySQLdb() #3) 两条数据库迁移命令即可在指定的数据库中创建表 : python3 manage.py makemigrations python3 manage.py migrate #4) 确保配置文件中的INSTALLED_APPS中写入我们创建的app名称: INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', "book" # 或者这种形式:'app名字.apps.App01Config', ]代码示例:
# 在脚本中调用djagno服务 import os if __name__ == '__main__': # 1 引入django配置文件 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day067.settings') # 2 让djagno启动 import django django.setup() # 3 使用表模型 from app01 import models models.Book.objects.create(name='测试书籍', publish='xx出版社') models.Book.objects.create(name='凡人修仙传', publish='古彭出版社') models.Book.objects.create(name='神墓', publish='古彭出版社') models.Book.objects.create(name='从姑获鸟开始', publish='南京出版社') models.Book.objects.create(name='铁血残明', publish='南京出版社') for i in range(198): models.Book.objects.create(name='重返东京有点热%s' % i, publish='东京出版社') # 单表API查询 # < 1 > all(): 查询所有结果,返回queryset对象,可以看作是列表 res = models.Book.objects.all() print(res) print(type(res)) # <class 'django.db.models.query.QuerySet'> # < 2 > filter(**kwargs): 过滤 queryset对象的方法 res = models.Book.objects.filter(name='从姑获鸟开始') print(res) # <QuerySet [<Book: 从姑获鸟开始>]> res = models.Book.objects.all().filter(name='从姑获鸟开始') print(res) # <QuerySet [<Book: 从姑获鸟开始>]> res = models.Book.objects.all().filter(name='从姑获鸟开始', publish='南京出版社') print(res) # <QuerySet [<Book: 从姑获鸟开始>]> print(type(models.Book.objects)) # <class 'django.db.models.manager.Manager'> # < 3 > get(**kwargs): queryset对象的方法,返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。 res = models.Book.objects.all().get(name='从姑获鸟开始') res1 = models.Book.objects.get(name='从姑获鸟开始') res2 = models.Book.objects.filter().get(name='从姑获鸟开始') print(res, type(res), res1, res2) # 从姑获鸟开始 <class 'app01.models.Book'> 从姑获鸟开始 从姑获鸟开始 # 返回的数据是——————————————》》》》》》数据对象本身 # < 4 > exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象,可以继续链式调用 res = models.Book.objects.exclude(name='从姑获鸟开始') print(type(res)) # <class 'django.db.models.query.QuerySet'> # < 5 > order_by(*field): 对查询结果排序(默认升序) 加-表示降序 res = models.Book.objects.all().order_by('id') res = models.Book.objects.all().order_by('-id') res = models.Book.objects.all().order_by('name', '-id') res = models.Book.objects.all().order_by('id', 'name') print(res) # < 6 > reverse(): 对查询结果反向排序,必须结合order_by使用,对结果进行反转,等同于 ('-i') res = models.Book.objects.exclude(name='从姑获鸟开始').order_by('id') res = models.Book.objects.exclude(name='从姑获鸟开始').order_by('id').reverse() print(res) # < 7 > count(): 返回数据库中匹配查询(QuerySet)的对象数量。 res = models.Book.objects.exclude(name='从姑获鸟开始').count() res = models.Book.objects.all().count() print(res) # 返回的数据是——————————————》》》》》》数字 # < 8 > first(): 返回第一条记录 res = models.Book.objects.exclude(name='从姑获鸟开始').first() print(res, type(res)) # 测试书籍 <class 'app01.models.Book'> # 返回的数据是——————————————》》》》》》数据对象本身 # < 9 > last(): 返回最后一条记录 res = models.Book.objects.exclude(name='从姑获鸟开始').last() print(res, type(res)) # 测试书籍 重返东京有点热197 <class 'app01.models.Book'> # 返回的数据是——————————————》》》》》》数据对象本身 # < 10 > exists(): 如果QuerySet包含数据,就返回True,否则返回False res = models.Book.objects.exclude(name='从姑获鸟开始').exists() print(res, type(res)) # True <class 'bool'> res = models.Book.objects.filter(name='从姑获鸟开始aaa').exists() print(res, type(res)) # False <class 'bool'> # 返回的数据是——————————————》》》》》》布尔值 # < 11 > values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列 res = models.Book.objects.all().values('name', 'publish') print(res, type(res)) # <QuerySet [...]> <class 'django.db.models.query.QuerySet'> res = models.Book.objects.all().values('name', 'publish').first() print(type(res), res) # <class 'dict'> {'name': '测试书籍', 'publish': 'xx出版社'} # < 12 > values_list(*field): 它与values()非常相似,不同的是它返回的queryset对象内部是一个元组序列,values返回的是一个字典序列 res = models.Book.objects.all().values_list('name', 'publish') print(type(res), res) # <class 'django.db.models.query.QuerySet'> res = models.Book.objects.all().values_list('name', 'publish').first() print(type(res), res) # <class 'tuple'> ('测试书籍', 'xx出版社') # < 13 > distinct(): 从返回结果中剔除重复纪录 --->>>在字段未设置唯一或联合唯一时使用 res = models.Book.objects.all().values('name', 'publish').distinct() print(type(res), res)重写模型类的效果对比: