ORM
全称:对象--关系--映射
数据表----类
数据行----对象
字 段----属性
优势:专注于后端逻辑,不用写复杂的sql语句
劣势:会忘掉sql,牺牲了效率
Django连接mysql数据库:
             DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'orm1', # 连接的数据库,需要自己提前创建好
'USER':'root', # 连接数据库的用户名
'PASSWORD':'root', # 连接数据库的密码
'HOST':'127.0.0.1', # 连接主机,默认本机
'PORT':3306, # 端口,默认3306
}
}

settings.py

项目目录下的__init__.py

         import pymysql
pymysql.install_as__MYSQLdb()

创建模型:app下的models.py

 # Create your models here.
class Book(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=32)
pub_date = models.DateField()
price = models.DecimalField(max_digits=8,decimal_places=2)
publish = models.CharField(max_length=32) def __str__(self):
return self.title

常用字段:

 常用字段类型
# 主键、自增 id = models.AutoField(primary_key=True)
# varchar name = models.CharField(max_length=16) 后面一定要有长度 代表varchar(16)
# 整数 age = models.IntegerField()
# 浮点数 price = models.DecimalField(max_digits=8,decimal_places=2) 最大长度八位,小数点后面两位
# 日期时间 birth = models.DateTimeField(auto_now_add=True) 对象创建时自动添加当前时间 就好比人出生就有一个生日一样
# 日期 pub_date = models.DateField(auto_now=True) 对象每次修改时修改为当前时间 两个互斥 不可共存
# 大文本类型 content = model.TextField()

自定义字段:

     class MyCharField(models.Field):
"""
继承model.Field
自定义的char类型字段
"""
def __init__(self,max_length,*args,**kwargs):
# super(MyCharField, self).__init__(max_length=max_length,*args,**kwargs)
super().__init__(max_length,*args,**kwargs)
# models.Field.__init__(self,max_length=max_length,*args,**kwargs)
self.max_length = max_length def db_type(self, connection):
"""
限定生产数据库表的字段类型为char,长度为max_length指定的值
:param connection:
:return:
"""
return 'char(%s)'%self.max_length

字段参数:

 字段参数
null = True 和数据库直接关联
blank = True 和表单提交验证关联 一般同时写上
db_column 列名 数据库显示的列名 但是orm还是自己的列名
default 默认值
unique 唯一索引
verbose_name admin显示中文
choices sex = models.CharField(max_length=2,choices=(('','男'),('','女'),('','未知'))) 数据库存的是前面的,要显示后面的用obj.get_sex_display()
模版取值{{ user|func:'sex'}} func是自己写的过滤器

Meta配置:

    class Meta:
# 数据库生成的表名
db_table='table_name'
verbose_name='admin站点表名显示的名称'
verbose_name_plural='对象是复数时显示的名称' #联合唯一索引
unique_together=[
('field1','field2')
]

生成迁移文件:

 python manage.py makemigrations

执行迁移:

 python manage.py migrate

必知必会13条查询方式:

为了方便查询,添加django环境。直接运行py文件

import os

if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ORM1.settings")
import django
django.setup() from app01.models import Book # 对象列表
# ret = Book.objects.all()
# print(ret) # get 不存在就报错 获取多个就报错
# ret = Book.objects.get(pk=3)
# print(ret) # Java ret.price # filter 返回queryset集合 不存在返回空,
# ret= Book.objects.filter(pk=3)
# print(ret) # <QuerySet [<Book: Java>]> ret[0].price # exclude 排除 不包含
# ret = Book.objects.exclude(id=3)
# print(ret) # 返回queryset集合 获取指定参数,默认获取所有 相当于select * form Book 的 * 字典类型
# ret = Book.objects.all().values()
# # ret = Book.objects.all().values('title','price')
# # print(ret) # 返回queryset集合 和values一样,但是是元祖形式
# ret = Book.objects.all().values_list('title','price')
# print(ret) # order_by 排序可以按照多个字段
# ret = Book.objects.order_by('-pk','price')
# print(ret) # reverse 反转 对排序后的结果再反转
# ret = Book.objects.order_by('-pk', 'price').reverse()
# print(ret) # distinct 去重 针对的是对字段去重 对all使用无任何意义
# ret = Book.objects.all().values('title').distinct()
# print(ret) # count 计数
# ret = Book.objects.all().count()
# print(ret) # exists 判断数据是否存在
# ret = Book.objects.filter(pk=3).exists()
# print(ret) # -----------------------------------模糊查询-----------------------------------
print(Book.objects.filter(price__gt=70).values('title','price')) # 大于 等于在后面加e
print(Book.objects.filter(price__lt=70).values('title','price')) # 小于 等于在后面加e
print(Book.objects.filter(title__startswith='P')) # <QuerySet [<Book: Python>]>
print(Book.objects.filter(title__icontains='p')) # <QuerySet [<Book: Python>, <Book: php>]>
print(Book.objects.filter(price__in=[66,99]))
print(Book.objects.filter(price__range=[60,90]))

总结:

 总结:
返回queryset集合
all()
filter()
exclude()
order_by
reverse()
values() {}
values_list() ()
distinct()
返回对象
get()
first()
last() 返回布尔值
exists() 返回数字
count()

查询之后才能进行更新或删除操作

删除:

 ret = Book.objects.filter(title='Linux').delete()
Book.objects.filter(publish='人民出版社').first().delete()
print(ret) # 元祖 返回个数和记录

更新:

     # update 更新  调用者 queryset
Book.objects.filter(id=1).update(price=99.99)

009---Django的模型层(1)的更多相关文章

  1. 64、django之模型层(model)--建表、查询、删除基础

    要说一个项目最重要的部分是什么那铁定数据了,也就是数据库,这篇就开始带大家走进django关于模型层model的使用,model主要就是操纵数据库不使用sql语句的情况下完成数据库的增删改查.本篇仅带 ...

  2. 67、django之模型层(model)--查询补充及mookie

    本篇导航: F查询与Q查询 cookie 一.F查询与Q查询 1.以Book表为例 class Book(models.Model) : title = models.CharField(max_le ...

  3. 【Django】模型层说明

    [Django模型层] 之前大概介绍Django的文章居然写了两篇..这篇是重点关注了Django的模型层来进行学习. ■ 模型定义 众所周知,Django中的模型定义就是定义一个类,其基本结构是这样 ...

  4. django之模型层(model)--建表、查询、删除基础

    要说一个项目最重要的部分是什么那铁定数据了,也就是数据库,这篇就开始带大家走进django关于模型层model的使用,model主要就是操纵数据库不使用sql语句的情况下完成数据库的增删改查.本篇仅带 ...

  5. django之模型层(model)--查询补充及cookie

    已经连续写了好几篇django的模型层(model)增删改查的随笔了,没篇大篇幅都是查询相关的操作,可以看出查询在数据的操作中是多么的重要,而本篇最后再补充一点关于关于查询的一些方法,模型层基本的操作 ...

  6. python 全栈开发,Day70(模板自定义标签和过滤器,模板继承 (extend),Django的模型层-ORM简介)

    昨日内容回顾 视图函数: request对象 request.path 请求路径 request.GET GET请求数据 QueryDict {} request.POST POST请求数据 Quer ...

  7. Django基础(2)--模板自定义标签和过滤器,模板继承 (extend),Django的模型层-ORM简介

    没整理完 昨日回顾: 视图函数: request对象 request.path 请求路径 request.GET GET请求数据 QueryDict {} request.POST POST请求数据 ...

  8. Django之模型层(2)

    Django之模型层(2) 一.创建模型 实例:我们来假定下面这些概念,字段和关系. 作者模型:一个作者由姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情 ...

  9. 第五章、Django之模型层----多表查询

    目录 第五章.Django之模型层----多表查询 一.一对多字段增删改查 1.增 2.查 3.改 4. 删除 二.多对多的增删改查 1. 增 2. 改 3. 删 三.ORM跨表查询 四.正反向的概念 ...

  10. 第五章、Django之模型层---单表操作

    目录 第五章.Django之模型层---单表操作 一.ORM查询 二.Django测试环境搭建 三.单表查询 1. 增 2. 改 3. 删 4. 查 第五章.Django之模型层---单表操作 一.O ...

随机推荐

  1. The fool doth think he is wise, but the wise man knows himself to be a fool.

    The fool doth think he is wise, but the wise man knows himself to be a fool.愚者总自以为聪明,智者则有自知之明.

  2. maven struts2工程StrutsPrepareAndExecuteFilter cannot be cast to javax.servlet.Filter

    maven搭建struts2工程时报错 严重: Exception starting filter struts2java.lang.ClassCastException: org.apache.st ...

  3. Struts2_Action和Result总结

    Action 1.实现一个Actiond的最常用方式:从ActionSupport继承2.DMI动态方法调用3.通配符配置 *{1}{2}... a) *_*4.接收参数的方法(一般用属性或者Doma ...

  4. 使用fn_dblog函数查看事务日志和恢复数据

    基本语法 SqlServer中有一个未在文档中公开的函数sys.fn_dblog,提供查询当前数据库事务日志的功能.通过这个函数,可以简单了解下数据库事务日志的机制 使用方法如下: select * ...

  5. nginx处理HTTP header问题

    在实际开发中遇到http header 自定义key中包含下划线(_)时服务端header丢失的问题,解决办法详细见以下网页内容,感谢原博主 http://blog.csdn.net/dac55300 ...

  6. 数据结构与算法分析java——线性表1

    说到线性结构的话,我们可以根据其实现方式分为三类: 1)顺序结构的线性表 2)链式结构的线性表 3)栈和队列的线性表   应用程序后在那个的数据大致有四种基本的逻辑结构: 集合:数据元素之间只有&qu ...

  7. Ubuntu Deb包安装<个人笔记>

    安装 删除 卸载 Deb 包文件   图形界面: 安装deb 直接双击图标,输入密码后就可自动安装. 卸载deb 1. 菜单-系统->系统管理->新立得软件包管理器 或 Alt+F2(运行 ...

  8. 如何用代码填充S/4HANA销售订单行项目的数量字段

    我的任务是用代码生成S/4HANA销售订单(Sales Order)的行项目,并且填充对应的quantity(数量)值. 最开始我用了下面的代码,把quantity的值写入item字段target_q ...

  9. 爬虫第一篇基本库的使用——urllib

    在Python2中有urllib2和urllib3两个库来实现请求的发送,在Pyhon3中则统一为urllib. urilib包含以下4个模块 request:最基本的请求模块,可以用来实现请求的发送 ...

  10. 线程属性总结 线程的api属性

    http://blog.csdn.net/zsf8701/article/details/7842392 //线程属性结构如下:typedef struct{ int etachstate; //线程 ...