一 . ORM

  ORM是“对象-关系-映射”的简称。(Object Relational Mapping,简称ORM)

二. 单表操作

  要想将模型转为mysql数据库中的表,需要在setting里面写上这个,把原来带的替换掉

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'book', # 要连接的数据库名,连接前需要创建好
'USER': 'root', # 连接数据库的用户名
'PASSWORD': '', # 连接数据库的密码
'HOST': '127.0.0.1', # 连接主机,默认本机
'PORT': 3306 # 端口 默认3306
}
}

  还需在项目名下的__init__的文件中写 :      写成这个的目的是将django默认的驱动MySQLdb 改为 pyMySQL,因为MySQLdb对于py3有很大的问题.

import pymysql
pymysql.install_as_MySQLdb()

  通过两条数据库迁移命令在指定数据库建表

python manage.py makemigrations  #生成记录,每次修改了models里面的内容或者添加了新的app,新的app里面写了models里面的内容,都要执行这两条
python manage.py migrate #执行上面这个语句的记录来创建表,生成的表名字前面会自带应用的名字,例如:你的book表在mysql里面叫做 app01_book 表

  

 

  然后需要在python里面查看呢表中内容,需要进行下列操作

    

  

  

  如果想打印ORM转换过程中的SQL语句,需要在setting中设置配置:

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}

三 . 增删改查相关操作

    在python中ORM三种对应关系

    类----------------->表

    类对象----------->行(记录)  # 可以进行增删改查操作 (.create, .delete(), .update(), .filter(id=1), )

    类属性----------->表字段

# 增加
# 方法一
book_obj = models.Book(name='吴彦祖', gender='男') # 如果是日期个格式必须写2018-01-01 这种格式
book_obj.save() # 方法二
models.Book.objects.create(name='吴彦祖',gender='男') # 这里的Book是models.py文件里面的类名 # 批量增加
obj_list = []
for i in range(100):
obj = models.UserMsg(
username= 'daniel%s' %i,
password='abc%s' %i
)
obj_list.append(obj)
models.UserMsg.objects.bulk_create(obj_list)
# 查询
obj = models.Book.objects.filter(id=1) # 查询id=1的对象 即使是筛选出来的只有一个,那么也要在后面加上[索引],因为装在列表里.
obj = models.Book.objects.all() # 查询所有的数据 # 上面的obj都是一个类似于用列表装的对象,要想取出来,可以使用for循环,或者后面加上[索引],
# 然后想要取到对应的字段,直接点字段就可以, 例如obj[0].name 就是取到该行的name字段的数据.
# 删除
models.Book.objects.all().delete() # 删除所有数据
models.Book.objects.filter(id=1).delete() # 删除id=1的数据
# 改
models.Book.objects.filter(id=1).update(name='刘德华') # 把id=1的姓名改为刘德华

四 . mdels.py的__str__方法

from django.db import models

# Create your models here.

class Book(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8,decimal_places=2,)
pub_date = models.DateTimeField() #必须存这种格式"2012-12-12"
publish = models.CharField(max_length=32)
def __str__(self): #后添加这个str方法,也不需要重新执行同步数据库的指令
return self.name #当我们打印这个类的对象的时候,显示name值 # 这时候你要打印query set对象的时候就会显示name名字,看着明白些

五 . 查询表记录(重点)

  Book.objects调用下面这些方法:

# 调用这些方法必须是queryset类型的,也就是说调用完下列方法后结果还是queryset类型的可以继续调用下列的方法
Q <1> all() : # 结果是queryset类型
Q <2> filter(**kwargs): 里面的关键字参数用逗号隔开,表示and的意思# 结果是queryset类型
<3> get(**kwargs): 结果是model对象,相当于queryset对象[索引]之后的,返回的结果有且只有一个
Q <4> exclude(**kwargs): 排除的意思,除了括号里面的都要, # 结果是queryset类型
Q <5> order_by(*字段): 排序,默认升序,前面加负号(-)就是降序,括号里面要加引号
                 # 写两个参数就是第一个参数相同的情况下,按照第二个参数排序. # 结果是queryset类型
Q <6>reverse(): 对查询结果反向排序,可以在order_by后面直接写 # 结果是queryset对象
Q <7>count(): 匹配查询(queryset)对象, # 结果是queryset类型
<8>first(): 返回第一条记录 是model对象
<9>last(): 返回最后一条记录 是model对象
<10>exists(): 如果有数据就返回True,没有就返回False
Q <11>values(*字段): 用的比较多,返回可迭代字典的序列 # 是一个特殊的queryset类型
Q <12>values_list(*字段): 和values很像,返回的是一个元组序列 # 是一个特殊的queryset类型
Q <13> distinct():     一定要写在values或者values_list后面进行去重, 例: values('name').distinct()
# 序号前面有Q的都是Queryset类型

  values(*字段)的用法

all_books = models.Book.objects.all().values('name','id')
print(all_books) #<QuerySet [{'name': '九阳神功', 'id': 1}, {'name': '吸星大法', 'id': 2}]>

  values_list(*字段)的用法

all_books = models.Book.objects.all().values_list('id','name')
print(all_books) #<QuerySet [(1, '九阳神功'), (2, '吸星大法')]>
# 里面是元组

  distinct()的用法

 # all_books = models.Book.objects.all().distinct() #这样写是表示记录中所有的字段重复才叫重复.
# all_books = models.Book.objects.all().distinct('price') #报错,不能在distinct里面加字段名称
# all_books = models.Book.objects.all().values('price').distinct() 如果values 中有两个参数,那么需要这两个都重复才去掉
    # 打印结果<QuerySet [(Decimal('33.00'),), (Decimal('111.00'),)]>

  基于双下划线的模糊查询

Book.objects.filter(price__in=[100,200,300])   #price值等于这三个里面的任意一个的对象
Book.objects.filter(price__gt=100) #大于,大于等于是price__gte=100,不支持price>100这种参数
Book.objects.filter(price__lt=100) # 小于
Book.objects.filter(price__range=[100,200]) #sql的between and,大于等于100,小于等于200
Book.objects.filter(title__contains="python") #title值中包含python的
Book.objects.filter(title__icontains="python") #不区分大小写
Book.objects.filter(title__startswith="py") #以什么开头,istartswith 不区分大小写
Book.objects.filter(pub_date__year=2012) # 查找2012年的数据
  # 得到的都是queryset类型 # __month 查找月 __day 查找日
# 如果明明有要找的日期,但是报错,在setting的配置文件中把 USE_TZ 改为 False,这是由于mysql数据库和django的数据库时区不同导致的

Django--ORM和单表查询的更多相关文章

  1. 数据库开发-Django ORM的单表查询

    数据库开发-Django ORM的单表查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询集 1>.查询集相关概述 查询会返回结果的集,它是django.db.mod ...

  2. Django ORM 之 单表、多表查询

    返回ORM目录 Django ORM Django ORM 之一 内容目录: 一.单表查询 二.多表查询 0.准备工作 一些说明: - 表myapp_person的名称是自动生成的,如果你要自定义表名 ...

  3. 三、Django学习之单表查询接口

    查询接口 all() 查询所有结果,结果是queryset类型 filter(**kwargs) and条件关系:参数用逗号分割表示and关系 models.Student.objects.filte ...

  4. Django ORM 操作 必知必会13条 单表查询

    ORM 操作 必知必会13条 import os # if __name__ == '__main__': # 当前文件下执行 os.environ.setdefault('DJANGO_SETTIN ...

  5. Django框架之第六篇(模型层)--单表查询和必知必会13条、单表查询之双下划线、Django ORM常用字段和参数、关系字段

    单表查询 补充一个知识点:在models.py建表是 create_time = models.DateField() 关键字参数: 1.auto_now:每次操作数据,都会自动刷新当前操作的时间 2 ...

  6. python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)

    12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...

  7. django之orm单表查询

    这几天重新学习了一下django的orm,以此作为记录来分享. Part1:修改配置,生成表 在写数据和查数据之前,首先先得把django配置一下,具体配置如下: 1.先在公共项目的settings中 ...

  8. Django中模型层中ORM的单表操作

    ORM概念: MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员 ...

  9. Django开发:(3.1)ORM:单表操作

    MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需 ...

  10. ORM单表查询,跨表查询,分组查询

    ORM单表查询,跨表查询,分组查询   单表查询之下划线 models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值models ...

随机推荐

  1. 对tomcat7模拟并发请求及相关配置参数的含义

    这里的并不是真正的并发请求,因为for循环是间隔10毫秒,并且线程初始化也需要时间的,到真正执行http请求的时刻是不确定的.  tomcat 的运行状态可以在webapps下的manage项目查看, ...

  2. nginx作为负载均衡服务器,tomcat作为应用服务器

    1 如果想用一台主机,能够部署多个站点,并且访问每个站点都要求是在80端口,可以采用nginx+tomcat的方式 需要注意的是,tomcat一定不要监听80端口.   可以将静态资源配置在nginx ...

  3. 转://linux下hugepages理解

    就Linux应用程序而言,使用的都是虚拟地址,当应用程序读写一个指定的虚拟地址时,内存管理单元会自动进行虚拟地址到物理地址的转换.一个虚拟地址可以映射到多个物理地址,但当前映射到哪一个物理地址取决于当 ...

  4. 【angularjs】使用angular搭建项目,图片懒加载资料

    demo: <ion-view view-title="{{chat.name}}"> <style type="text/css"> ...

  5. Python代码分行问题

    可以用“\”符号把一行过长的Python代码分解成几行,多个语句也可以写在同一行,语句之间要用“;”隔开.

  6. (二 -3-1) 天猫精灵接入Home Assistant-自动发现Mqtt设备--灯系列 实战

    #本片教程介绍了具体如何实现天猫精灵控制一个灯. 前提: HASS平台 你已经搭建一个可以在公网IP访问到的HASS平台--- 我用的是租了阿里云服务器,买了个域名,ubuntu1604系统 你已经搭 ...

  7. ssm框架整合+Ajax异步验证

    SSM框架是目前企业比较常用的框架之一,它的灵活性.安全性相对于SSH有一定的优势.说到这,谈谈SSM和SSH的不同点,这也是企业常考初级程序员的面试题之一.说到这两套框架的不同,主要是持久层框架Hi ...

  8. StackExchange.Redis使用配置

    转自:http://www.cnblogs.com/deosky/p/4848403.html Configurationredis有很多不同的方法来配置连接字符串 , StackExchange.R ...

  9. python:面向对象编程之Zope.interface安装使用

    持续学习python+django中... 一.接口简述 在我们所熟知的面向对象编程语言中,大多提供了接口(interface)的概念.接口在编程语言中指的是一个抽象类型,是抽象方法的集合:它的特点如 ...

  10. asp.net调用前台js调用后台代码分享

    asp.net调用前台js调用后台代码分享 C#前台js调用后台代码前台js<script type="text/javascript" language="jav ...