Django-ORM
Django的orm
1. 创建模型的步骤
步骤一:需要创建一个数据库
步骤二:settings中配置连接
DATABASES = {
# sqlites:是非常小型的文件数据库
'default':{
'ENGINE': 'django.db.backends.mysql',
'NAME': 'day55', # 数据库名称
'USER': 'root', # 用户名
'PASSWORD': '123', # 连接数据库的密码
'HOST': '127.0.0.1',
}
}
步骤三:在对应的app中的__init__文件下面配置:要使用pymysql去连接数据库
# python3
import pymysql
pymysql.install_as_MySqldb()
# MYSQL-python是python2连接数据库的包
步骤四:在settings中的INSTALLED_APPS中加上app
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'classes.apps.ClassesConfig',
'classes',
'teachers',
'students',
]
2.模型的创建
在models.py文件中创建表,一个类对应一张表
# 创建表
from django.db import models
class UserInfo(models.Model):
id = models.AutoField(primary_key=True) # 主键,自增长
name = models.CharField(max_length=32,null=True) # varchar(32),可为空
age = models.CharField(max_length=32,null=True)
# 一对多,to:关联表 to_field:关联哪个字段。不写就默认关联id
ut = model.ForeignKey(to="UserType")
# 此时会在Userinfo里添加一列ut_id,ut代表关联的UserType的一行一行数据对象,ut_id就是关联的外键的值
class UserType(models.Model):
# 不写id这一行代码的时候,会自动添加id自增这一列
title = models.CharField(max_length=32,null=True)
# 将类转换成实际的表,注意:在models中修改任意一条代码都要重新执行上面两条命令
python manage.py makemigrations # 生成
python manage.py migrate #
# 在原有基础上增加外键对应关系时,遇到以下问题
You are trying to add a non-nullable field 'ut' to classes without a default; we can't do that (the database needs som
ething to populate existing rows).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit, and let me add a default in models.py
Select an option: 2
1)在命令行上添加一个值
2)退出,自己在model.py里添加默认的值:ut=model.ForeignKey(to="UserType",null=True)(推荐使用2)
3.orm单表的增删改查
# 在view.py文件中增删改查,在url中配置下路由
from app01 import models # 先导入要用到的模型
def ormtest(request):
# 查询
res = models.UserInfo.objects.all() # 查询的所有数据
# res的结果是queryset类型,以列表的形式包含对象,可以同过for循环取值<QuerySet [<Classes: Classes object>,<Classes: Classes object>]>
# res的类型<class 'django.db.models.query.QuerySet'>
for obj in res:
print(obj.age, obj.name)
res = models.UserInfo.objects.values('name','age') # 只查询想获取的列名,返回的结果是列表里面套字典
res = models.UserInfo.objects.value_list('name','age') # 只查询想获取的列名,返回的是列表套元组
res = models.UserInfo.objects.first() # 查询第一个值,返回是的是单个对象
res = models.UserInfo.objects.filter(id__gt=3).all() # 条件查询id__gt=3表示where id>3,id__gte=3表示where id>=3。返回的结果是列表套对象
# 增加
# 第一种增加方式
models.UserInfo.objects.create(name='kkk',age=13,ut_id=1)
# 第二种用字典的格式
userInfo = {"name":'sss','age':12,'ut_id':2}
models.UserInfo.objects.create(**userInfo)
# 添加多条数据
userinfo = [
models.UserInfo(name='root1',age=18),
models.UserInfo(name='root2',age=19),
models.UserInfo(name='root3',age=20)
]
models.UserInfo.objects.bulk_create(userinfo)
# 删除
models.UserInfo.objects.filter(id=3).delete()
# 更新
models.UserInfo.objects.filter(id=3).update(name='ddsd')
return HttpResponse('ok')
4.一对多表的正向查询和反向查询
# 正向查询
# 获取某一用户所对应的用户类型
res = models.UserInfo.objects.all()
for obj in res:
print(obj.name,obj.age,obj.ut.title) # ut是关联表的一行一行数据的对象,通过ut跨到主表查询
models.UserInfo.objects.values('name','age','ut__title')
models.UserInfo.objects.values_list('name','age','ut__title')
# 反向查询 表名小写_set
# 获取所有用户类型下面的用户
res = models.UserType.objects.all()
for obj in res:
print(obj.id,obj.title,obj.userinfo_set.all())
# obj.userinfo_set.all() 相当于models.UserInf.object.filter(ut_id=a).all()
# 使用表名小写__字段名
res = models.UserType.objects.values('title','userinfo__id','userinfo__name','userinfo__age')