django的OMR

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)
posted @ 2019-08-23 15:03  X_solitude  阅读(225)  评论(0编辑  收藏  举报