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)

最新文章

  1. 关于Ciarlet的泛函的一道homework的一个想法
  2. 关于VS打包程序无法弹出主界面的问题
  3. [BTS] RFC IDOC_INBOUND_ASYNCHRONOUS
  4. show processlist 其中status详解(适用于所有概况)
  5. [apache]用shell分析网站的访问情况
  6. 在Android项目中使用AndroidAnnotations(配置框架,显示Hello World!)
  7. 前端制作中,IE6还有必要兼容吗?
  8. POJ 1226 Substrings(后缀数组+二分答案)
  9. 【Java 之 JVM】Java内存结构概述
  10. Push to origin/master was rejected (Git提交错误)
  11. 西北地区打不开github的解决办法~
  12. VS开发入门二: VS 里提示图标的含义
  13. 利用Python中的for循环和while循环,打印各种方向的九九乘法表。
  14. converting the moment tensor to strie-dip-rake
  15. HTML中head与body标签
  16. 20155205 2016-2017-2 《Java程序设计》第2周学习总结
  17. hadoop mongodb install(3)
  18. MONGODB用户、角色和权限管理
  19. 【Java并发编程】:死锁
  20. 【bzoj4084】【sdoi2015】双旋转字符串

热门文章

  1. css取消a标签在移动端点击时的背景颜色
  2. Android基础Activity篇——Toast
  3. 升级jdk注意事项
  4. java,eclipse中如何添加httpclient.jar
  5. tomcat8.5配置优化
  6. 【CSS古话今说】-- 01.神奇的CSS-BFC在实战中的应用
  7. CRM WebUI and Hybris的Product页面标题实现
  8. ABAP Netweaver和Hybris Enterprise Commerce Platform的登录认证
  9. sap.ui.require in SAP UI5 and require in nodejs
  10. 解析xml文件,修改Jenkins的配置