Django-ORM
发布时间:2020-12-20 11:00:29 所属栏目:Python 来源:网络整理
导读:Django的orm 1. 创建模型的步骤 步骤一:需要创建一个数据库 步骤二:setting中配置连接 DATABASES = { # sqlites:是非常小型的文件数据库 'default':{ 'ENGINE': 'django.db.backends.mysql','NAME': 'day55',# 数据库名称 'USER': 'root',# 用户名 'PASSWO
Django的orm1. 创建模型的步骤步骤一:需要创建一个数据库 步骤二:setting中配置连接 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) # 删除 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','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') (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |