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')  

原文地址:https://www.cnblogs.com/863652104kai/p/11349173.html