Django 2.0 学习(14):Django ORM 数据库操作(上)
Django ORM 数据库操作(上)
ORM介绍
映射关系:
数据库表名 ---------->类名;数据库字段 ---------->类属性;数据库表一行数据 ---------->类实例化对象;
ORM两大功能:
操作表:创建、修改、删除表;
操作数据:增删改查;
ORM利用pymysql第三方工具连接数据库,Django无法帮助我们创建数据库,只能我们创建完成后告诉它,让Django去连接;
创建表之前的准备工作
1.自己创建数据库;
2.在settings.py文件中配置mysql数据库连接,sqlite3改为mysql:
# 修改django默认sqlite3数据库为mysql
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mydatabase',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
修改project中的__init__.py文件,设置Django默认连接MySQL的方式:
import pymysql
pymysql.install_as_MySQLdb()
3.创建数据库表
打开models.py文件,写入如下代码:
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
models.DateField()
def __str__(self):
return self.question_text
执行命令创建
python manage.py makemigrations 创建脚本
python manage.py migrate 数据迁移
4.查看数据库的sql语句(家在settings.py文件中)
# 查看数据库执行代码
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level': 'DEBUG',
},
}
}
多对多的正反向查询
在models.py文件中的模型如下:
class Class(models.Model):
name = models.CharField(max_length=32, verbose_name='班级名称')
course = models.CharField(max_length=32, verbose_name='课程')
def __str__(self):
return self.name
class Teacher(models.Model):
name = models.CharField(max_length=32, verbose_name='姓名')
classes = models.ManyToManyField(verbose_name='所属班级', to='Class')
def __str__(self):
return self.name
题目1:查找吴老师所带班级
# 方式一:基于对象的查找
obj = models.Teacher.objects.filter(name="吴老师").first()
print(obj.classes.all())
print("吴老师带的班级",obj.classes.values("name"))
# 方式二:基于双下划线的查找
obj_cls = models.Teacher.objects.filter(name="吴老师").values("classes__name")
print("吴老师带的班级",obj_cls)
注意:查询单个的时候用.values或者value_list,不要用obj.classes.name,这样查询到的会是None,反向查询也是如此,不管是一对多,还是多对多,查询多的一方就用.all()方法。
运行结果(非此例结果):

表结构:
# 一个学生有一个班级,每个班级有好多学生,所以是多对一的关系,关联字放在多的一方
class Student(models.Model):
name = models.CharField(max_length=32, verbose_name='姓名')
age = models.IntegerField(verbose_name='年龄')
classes = models.ForeignKey(verbose_name='所属班级', to='Class')
def __str__(self):
return self.name
class Class(models.Model):
name = models.CharField(max_length=32, verbose_name='班级名称')
course = models.CharField(max_length=32, verbose_name='课程')
def __str__(self):
return self.name
class Teacher(models.Model):
name = models.CharField(max_length=32, verbose_name='姓名')
classes = models.ManyToManyField(verbose_name='所属班级', to='Class')
def __str__(self):
return self.name
题目2.陈凡在哪个班级
# 方式一:
print("陈凡所在班级:", models.Student.objects.filter(name="陈凡").values("classes__name")
# 方式二:
obj_class = models.Student.objects.filter(name="陈凡").first()
print("陈凡所在班级:", obj_class.classes.name)
题目3.查询陈凡所在班级的老师姓名
print("陈凡所在班级老师的姓名:", models.Student.objects.filter(name="陈凡").values("classes__teacher__name)
题目4.查询高三2班所有学生姓名
print("高三2班所有学生姓名", models.Class.object.filter(name="高三2班").values("student__name")
object_class = models.Class.object.filter(name="高三2班").first()
print("高三2班所有学生姓名", object_class.student_set.all().values("name"))
# print("高三2班所有学生姓名", object_class.student_set.name) 这样打印的结果是None
重要知识点
form表单中要用submit,如果用button切记要加上type,不然button默认的type是submit,会有影响:
<button type="button" onclick="doValidation();">提交</button>
<input type="button" onclick="doValidation();" value="提交" />
// 上面两种写法是对的,功能一样
<button onclick="doValidation();">提交</button>
// 如果写成这种,默认为submit。本来doValidation方法里有提交功能了,再加上按钮也是提交功能,会提交两次。所以使用按钮时最好指定type类型。
Django 2.0 学习(14):Django ORM 数据库操作(上)的更多相关文章
- Django 2.0 学习(16):Django ORM 数据库操作(下)
Django ORM数据库操作(下) 一.增加表记录 对于表单有两种方式: # 方式一:实例化对象就是一条表记录france_obj = models.Student(name="海地&qu ...
- Django 2.0 学习(07):Django 视图(进阶-续)
接Django 2.0 学习(06):Django 视图(进阶),我们将聚焦在使用简单的表单进行处理和精简代码. 编写简单表单 我们将用下面的代码,来替换之前的detail模板("polls ...
- Django【第5篇】:Django之ORM数据库操作
django之ORM数据库操作 一.ORM介绍 映射关系: 表名 -------------------->类名 字段-------------------->属性 表记录-------- ...
- golang学习笔记16 beego orm 数据库操作
golang学习笔记16 beego orm 数据库操作 beego ORM 是一个强大的 Go 语言 ORM 框架.她的灵感主要来自 Django ORM 和 SQLAlchemy. 目前该框架仍处 ...
- Django 2.0 学习(04):Django数据库
数据库设置/配置 打开mysite/settings.py,我们会发现Django是用的是默认的数据库SQLite,如下图所示: Django也是支持其它数据库的,比如PostgreSQL.MySQL ...
- Django(三) ORM 数据库操作
大纲 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 2.创建数据库 表结构 二.Django ORM基本增删改查 1.表数据增删改查 2.表结构修改 三.Django ORM 字段 ...
- Django入门4: ORM 数据库操作
大纲 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 2.创建数据库 表结构 二.Django ORM基本增删改查 1.表数据增删改查 2.表结构修改 三.Django ORM 字段 ...
- django(六)之ORM数据库操作
https://www.cnblogs.com/haiyan123/p/7732190.html 一.ORM介绍 ORM——object relation mapping 映射关系: 表名 ----- ...
- Django框架(八) Django之ORM数据库操作
创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关系( ...
随机推荐
- 20155337 《Java程序设计》实验一(Java开发环境的熟悉)实验报告
20155337 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验内容及步骤 (一)使用JDK编译.运行简单的java程序 ·命令行下的程序开发 我在windows下 ...
- # 20155337 2016-2017-2 《Java程序设计》第五周学习总
20155337 2016-2017-2 <Java程序设计>第五周学习总结 教材学习内容总结 第八章 •语法与继承架构 •使用try.catch •特点: 使用try.catch语法,J ...
- Hadoop守护进程的作用(转)
概述: <ignore_js_op> Hadoop是一个能够对大量数据进行分布式处理的软件框架,实现了Google的MapReduce编程模型和框架,能够把应用程序分割成许多的 小的工作单 ...
- spring boot启动报内存溢出的问题
问题: springBoot项目,已经两次了,启动报内存溢出,内存泄露 分析: 内存泄露是因为垃圾回收器想要回收程序不用的对象,但是该对象还有引用存在 解决: 1.第一次是mybatis文件和Java ...
- 变态的iis10
IIS10发布网站不能使用.NET4.0需要重新注册在之前版本的系统中使用如下命令可以直接重新注册: 但是windowsServer2016(iis 10) 使用该命令 提示 版本不支持 C:\WIN ...
- javaweb(二十九)——EL表达式
一.EL表达式简介 EL 全名为Expression Language.EL主要作用: 1.获取数据 EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象.获取数 ...
- Codeforces Round #500 (Div. 2) D - Chemical table
首先我们如果满足三缺一,那么必有同行和同列的点 如果两行有同列的数,我们可以设想,他们最后会全部填充成为两者啥都有的情况 显然这个是个并查集 现在我们有了很多集合,每个集合自己可以进行三缺一操作,但是 ...
- throttle(节流)和debounce(防抖)
防抖和节流都是用来控制频繁调用的问题,但是这两种的应用场景是有区别的. throttle(节流) 有一个调用周期,在一个很长的时间里分为多段,每一段执行一次.例如onscroll,resize,500 ...
- MySQL高性能优化实战总结
1.1 前言 MySQL对于很多Linux从业者而言,是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰.在进行MySQL的优化之前必须要了解的就是MySQL的查询过程,很多 ...
- 建立 Python 虚拟环境
1.1 安装依赖包 $ yum -y install wget gcc epel-release git 1.2 安装 Python3.6和pip $ yum -y install python36 ...