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. springmvc实现文件下载到Android手机设备pda端

    1:首先要添加相关得jar文件,在pom.xml中 <dependency> <groupId>commons-fileupload</groupId> <a ...

  2. Homestead 安装 phpMyAdmin 作为数据库管理客户端 — Laravel 实战 iBrand API 教程

    简介 phpMyAdmin 是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库.借由此Web接口可以成为一个简易方式输 ...

  3. 如何在SecureCRT中给linux上传和下载文件

    方法/步骤     需要上传或者下载,需要使用rz和sz命令.如果linux上没有这两个命令工具,则需要先安装.可以使用yum安装.运行命令yum install lrzsz.   安装完成后就可以使 ...

  4. 如何使用事务码SMICM分析ABAP代码发起的HTTP请求的错误ICM_HTTP_SSL_PEER_CERT_UNTRUSTED

    当我用CL_HTTP_CLIENT往一个外网的url发请求时,遇到错误:ICM_HTTP_SSL_PEER_CERT_UNTRUSTED 错误是从这段ABAP代码里抛出来的: CALL METHOD ...

  5. vsftpd 启动 vsftpd:500 OOPS: bad bool value in config file for: guest_enable

    不然启动时会涌现毛病,举个例子 guest_enable=YES  后面出现空格,就会出现 为 vsftpd 启动 vsftpd:500 OOPS: bad bool value in config ...

  6. Poj(2225),三维BFS

    题目链接:http://poj.org/problem?id=2225 这里要注意的是,输入的是坐标x,y,z,那么这个点就是在y行,x列,z层上. 我竟然WA在了结束搜索上了,写成了输出s.step ...

  7. 找父节点和子节点个数(Poj1634)

    题目链接:http://poj.org/problem?id=1634 思路:按照工资从小到大排好,找到最近的那个身高较高的人. 有一点要注意的是,这里有个根节点,大boss,他的id是0,因此,我这 ...

  8. 火车进出站(POJ1363)

    题目链接:http://poj.org/problem?id=1363 #include <stdio.h> #include <stack> using namespace ...

  9. shell脚本监控URL并自动发邮件

    1.安装sendmail:yum install -y sendmail 2.安装mail:yum install -y mail 3.安装mutt:yum install -y mutt 4.启动s ...

  10. linux命令之grep命令

    grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正 ...