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. CentOS 上安装 GIT 服务

    获取 YUM 中 GIT 信息:    yum info git 查看当前 GIT 的版本:    git --version    或    git version 卸载当前版本的 GIT:     ...

  2. 切片操作:MATLAB VS Python

    切片操作:MATLAB VS Python 一.MATLAB 矩阵的拆分 1.冒号表达式: t = e1:e2:e3 e1表示初始值,e2为步长,e3为终止值(包括e3),产生一个从e1到e3,步长为 ...

  3. dedecms无法下载远程jpeg图片 织梦不能提取文章内容中的jpeg图片生成缩略图

    文件:/dede/inc/inc_archives_functions.php 代码: preg_match_all("/(src)=[\"|'| ]{0,}([^>]*\. ...

  4. Eclipse plug-in startup

    Plug-in Startup !SESSION 2013-09-02 16:28:29.546 -----------------------------------------------ecli ...

  5. ASP.NET MVC 音乐商店 - 1 创建项目

    我们的项目从在 Visual Studio 中的文件菜单中选择“新建”,选择“项目”开始. 然后,选择 C# 中的 Web 模板组,在右边的项目模板中选择 ASP.NET MVC3 Web 应用程序, ...

  6. Android开发之——依赖冲突Program type already present

    前言 实际开发中,为了提高开发速度和效率,总避免不了引用第三方提供的依赖和类库,如果含有相同依赖的类库被我们引用时,而他们的版本又不相同,就有可能会导致一系列问题和异常,本文结合本人时间总结和他人经验 ...

  7. Android Studio快捷键【Android学习入门】

    Studio快捷键[Android学习入门]" title="Android Studio快捷键[Android学习入门]"> 提示 Ctrl+P方法参数提示 Ct ...

  8. sharepoint 2010 FieldLookup 的更新方法

    网上有,但是是错误的,稍微改一下,就可以了 第一个方法是要更新的item,其中 _fieldname 为要更新的lookup字段名字,_lookupValue为要更新的值. public void S ...

  9. 如何通过C#实现网页信息采集的方法总结

    Internet上有着极其庞大的资源信息,各行各业的信息无所不有.网页的信息搜集就是获取网页的数据,然后通过程序分析,将有用的数据提取分离出来.搜索引擎工作的一部分就是网页数据抽取.比如编制程序抽取新 ...

  10. Vim插件推荐

    看下文时要知道我的<leader>键就是\. ctags C程序阅读辅助工具.在看C/C++代码的时候经常需要在文件之间跳来跳去,这是很麻烦的事,ctags就是解决这种问题的.ctags是 ...