一 .ORM--------单表操作
1. 创建orm表
python manage.py makemigrations # 创建生成表的脚本
python manage.py # 生成数据库表
2、必须安装pymysql pip install pymysql
3、找到项目名文件下的__init__,在里面写入:
import pymysql
pymysql.install_as_MySQLdb()
# models.py
form django.db import models
class Book(models.Model): # 表名book,django会自动使用项目名+我们定义的表名
# 如没有自定义主键,django会自动添加一个主键,字段名id 自增
name = models.CharField(max_length=20) # 字段名name 类型 vachar(20)
price = models.IntegerField() # 字段名price 类型int
pub_date = models.DateField() # 字段名pub_date 类型 date (时间戳)
author = models.CharField(max_length=32,null=False) # 默认可以为空,设置null=False则不能为空
def __str__(self):
return self.name # 打印实例对象时显示为self.name
2.通过视图函数对数据表进行增删改(单表操作)
# views.py
from django.shortcuts import render
from app_name.models import * # 导入models.py
def add(request): # 增加数据的视图函数
# 方式一
b = Book(name='python基础',price=99,author='yuan',pub_date='2017-12-12')
b.save()
# 方式二
Book.objects.create(name='python基础',price=99,author='yuan',pub_date='2017-12-12')
# Book.object.create(**dic) # 此写法必须客户端传来的值与表中的值一一对应时,就可直接使用客户端传来的字典
return HttpResponse('添加成功')
def update(request): # 修改数据的视图函数
# 方式一
b = Book.objects.get(author='yuan') # 使用get会得到一个Book的实例对象,但当get到0个或多个对象时会报错
b.price = 109
b.save() # 该方式会对每一个字段重新赋值,效率低
# 方式二
Book.objects.filter(author='yuan').update(price=109) # 使用filter会得到一个QuerySet集合对象(里面为每一个实例的Book对象),因为根据筛选可以得到多条结果;将所有作者为yuan的书的价格改为109
# 仅会对要修改的字段进行赋值,效率高
return HttpResponse('修改成功')
def delete(request): # 删除数据的视图函数
Book.objects.filter(author='yuan').delete()
return HttpResponse('删除成功')
3 .通过视图函数对数据表进行查询(单表操作)
filter()过滤
[:3]截取
first()第一条
last()最后一条
values()返回集合对象字典
values_kist()返回集合元祖对象
exclude()不包含
distinct()去除重
count()获取总记录数
order_by()排序
get()获取
def select(request):
book_list = Book.objects.filter(id=2) # 按条件查询 返回一个QuerySet集合对象
book_list = Book.objects.all() # 查询出所有结果 返回一个QuerySet集合对象
book_list = Book.objects.all()[:3] # 切片操作 取前三条; [::2]步长为2隔着取; [::-1]倒着取
book_list = Book.objects.first() # 取第一条 返回一个实例对象
book_list = Book.objects.last() # 取最后一条 返回一个实例对象
book_list = Book.objects.get(id=2) #按条件查询 返回一个Book实例对象 只能取出一条记录时才不报错
book_list = Book.objects.filter(id=2).values('name','price') # select name,price form book where id=2; 此时返回一个QuertSet集合对象,但是这个集合中是一个个的字典对象
book_list = Book.objects.filter(id=2).values_list('name','price') # select name,price form book where id=2; 此时返回一个QuertSet集合对象,但是这个集合中是一个个的元组对
book_list = Book.objects.exclude(author='yuan') # 返回不包含author='yuan' 的QuerySet
book_list = Book.objects.all().values('name').distinct() # 根据name去重,不加具体的字段无意义,因为表中有主键,记录不会重复
book_list = Book.objects.all().count() # 获取记录数 返回一个数字
book_list = Book.objects.order_by('name') # 按name进行排序
return render(request,'index.html',{'book_list':book_list})
4.通过视图函数对数据表进行查询(万能的双下划线单表操作)
__gt 大于 __lt 小于 __icontains包含 __in包含 not_in 不包含 __range 在范围内
Book.objects.filter(price__gt=50) # 查询出价格大于50的
Book.objects.filter(name__icontains='p') # 查询出名字里面包含p的,不区分大小写;name__contains='p'区分大小写
models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值
models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据
models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in
models.Tb1.objects.filter(name__contains="ven")
models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and
startswith,istartswith, endswith, iendswith, # 以什么开头,以什么结尾 带i的表示大小写不敏感
Book.objects.filter(pub_date__year=2016) # 查询所有pub_date为2016年的记录
__exact 精确等于 like 'aaa'
__iexact 精确等于 忽略大小写 ilike 'aaa'
__contains 包含 like '%aaa%'
__icontains 包含 忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。
__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__in 存在于一个list范围内
__startswith 以...开头
__istartswith 以...开头 忽略大小写
__endswith 以...结尾
__iendswith 以...结尾,忽略大小写
__range 在...范围内
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False
__isnull=True 与 __exact=None的区别
5. 获取orm对应原生的sql语句
author_obj=models.Author.objects.filter(id=2)
print(author_obj.query)
、在settings.py配置文件中加上logging,可在服务端输入orm对应的sql语句
复制代码
# 将以下代码加入settings.py文件的尾部
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}