django的orm
创建模型(model)的步骤
1.创建数据库
2.setting中配置连接
主文件中
DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3', ### 非常小型的文件数据库
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test', ## 数据库名称
'USER': 'root',
'PASSWORD': '', ## 安装 mysql 数据库时,输入的 root 用户的密码
'HOST': '127.0.0.1',
}
}
3.连接数据库
在对应app中的_ init _ 文件下面
import pymysql
pymysql.install_as_MySQLdb()
4.添加文件
主文件的setting中添加对应的app
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01',
'classes'
]
orm基本的增删改查
创建表
在app对应的models.py文件中
from django.db import models
# Create your models here.
# 一个class对应一个表
class UserInfo(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32,null=True)
age = models.IntegerField(null = True)
转换成实际的表(在terminal中执行)
python manage.py makemigrations ### 生成迁移文件
python manage.py migrate ### 生成实际的表
添加
# 单条添加
models.Test.objects.create(name='jerry',age=18)
# 多条添加
info = [
models.Test(name='qqq',age=21),
models.Test(name='zzz',age=22),
models.Test(name='lll',age=23)
]
models.Test.objects.bulk_create(info)
删除
models.Test.objects.filter(id=3).delete()
更新
models.Test.objects.filter(id=5).update(name="xxx")
查询
res = models.Test.objects.all()
for object in res:
print(object.name)
# 列表套字典形式
res = models.Test.objects.values('name','age')
print(res)
# 列表套元祖
res = models.Test.objects.values_list('name','age')
print(res)
# where条件查询
# id = 1
res = models.Test.objects.filter(id=1)
print(res)
# id > 3
res = models.Test.objects.filter(id__gt=3)
print(res)
联表查询
students表的cid关联classes表的id
# 正向查询
def Students(request):
res = models.students.objects.all()
for object in res:
print(object.name,object.cid.name)
# 反向查询
res = models.classes.objects.all()
for object in res:
print(object.id,object.students_set.all())
print(object.id,object.students.all()) # 取别名与_set的方式不能同时存在
查询大全
# 字段where条件查询
res = models.classes.objects.filter(id__gt=3) # id > 3
res = models.classes.objects.filter(id__gte=3) # id >= 3
res = models.classes.objects.filter(id__lte=3) # id < 3
res = models.classes.objects.filter(id__lt=3) # id <= 3
res = models.classes.objects.exclude(id=4) # id != 4
res = models.UserInfo.objects.filter(id=2, name='nick') # 满足多个条件查询
# in, not in
res = models.classes.objects.filter(id__in=[1,2,3,4]) # 在这几个里面
res = models.classes.objects.exclude(id__in=[1,2]) # 不在这几个里面
# between and
res = models.classes.objects.filter(id__range=[2,3]) # 取值包括边界
# 以...开头,以..结尾
res = models.classes.objects.filter(name__startswith='p') # 以..开头
res = models.classes.objects.filter(name__endswith='期') # 以..结尾
# 忽略大小写
res = models.classes.objects.filter(name__istartswith='P') # 前面加"i"的都是忽略大小写
# where name like '%3%'
res = models.classes.objects.filter(name__contains='3') # 包含某个字符串
# 正则表达式
res = models.classes.objects.filter(name__regex='^p9$')
# sum,count,max.min
from django.db.models import Count, Min, Max, Sum
rex = models.classes.objects.values('name').annotate(s=Sum('id')) # 以name分组求id的和
rex = models.classes.objects.values('name').annotate(s=Sum('id')).filter(students__id__gt=1) # 以name分组,求id>1的和
rex = models.classes.objects.values('name').annotate(a=Max('id')) # 以name分组求id的最大值
rex = models.classes.objects.values('name').annotate(a=Max('id')).filter(students__id__gt=1) # 以name分组,求id>1的的最大数
rex = models.classes.objects.values('name').annotate(i=Min('id')) # 以name分组求id的最小值
rex = models.classes.objects.values('name').annotate(i=Min('id')).filter(students__id__gt=1) # 以name分组,求id>1的的最小数
res = models.classes.objects.filter(id__gt=1).count() # id > 1 计数
# limit
res = models.classes.objects.all()[1:3] # 顾尾不顾头
# 最后一个
res = models.classes.objects.last()
# 查找第一个
res = models.Test.objects.first()
# only
res = models.classes.objects.only('name') # 只查询一项,但默认会带上id
# defer
res = models.classes.objects.defer('id') # 除某一项不查,其余都查,默认会带上id
# Q |:or &:and
from django.db.models import Q
res = models.students.objects.filter(Q(Q(id__gt=3) | Q(name='张三')) & Q(cid=2))
# F
from django.db.models import F
res = models.students.objects.update(cid=F('cid')+1) 给数字类型加减值
# 升序降序
models.UserInfo.object.all().order_by('id') # 默认是升序,前面加“-”是降序
models.UserInfo.object.all().order_by('-id', 'name') # 多个排序
原生sql语句
from django.db import connection,connections
cursor = connection.cursor()
cursor.execute("") # sql语句
row = cursor.fetchone
print(row)