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数据库操作
创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关系( ...
随机推荐
- 【bzoj3991】[SDOI2015]寻宝游戏 树链的并+STL-set
题目描述 给出一棵树,初始每个点都是非必经的.多次改变某个点的必经状态,并询问从任意一个点出发,经过所有必经的点并回到该点的最小路程. 输入 第一行,两个整数N.M,其中M为宝物的变动次数. 接下来的 ...
- [BZOJ2127]happiness-[网络流-最小割]
Description 传送门 Solution 按照最小割的思路考虑. 根据题意,当两个人都选文(理),需要砍掉两个人都选理(文)的加成:如果两个人选的不一样,就要都砍掉. 这是一个网络流建模的套路 ...
- Qt QStringLiteral
zz 解释QStringLiteral 原文发表于woboq网站 QStringLiteral explained 转载 原作者: Olivier Goffart 译者:zzjin QStringL ...
- 人脸识别引擎SeetaFaceEngine简介及在windows7 vs2013下的编译
SeetaFaceEngine是开源的C++人脸识别引擎,无需第三方库,它是由中科院计算所山世光老师团队研发.它的License是BSD-2. SeetaFaceEngine库包括三个模块:人脸检测( ...
- Tomcat安装部署和安全加固优化以及反向代理应用
1.Tomcat介绍 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.Sun和其他一些公司及个人共同 ...
- Java读取Propertity文件
读取propertity 文件其实很简单,就是每次容易搞错文件路径,今天刚好项目又用到了,顺便记下来,以便以后参考: 目录如下: 代码如下: package com.infs.exam.process ...
- Objective-C 方法交换实践(二) - 方法指针交换
一. 基本函数 根据 sel 得到 class 的实例方法 Method class_getInstanceMethod(Class cls, SEL name) 根据 sel 得到 class 的函 ...
- GitHub 多人协作开发 三种方式:
GitHub 多人协作开发 三种方式: 一.Fork 方式 网上介绍比较多的方式(比较大型的开源项目,比如cocos2d-x) 开发者 fork 自己生成一个独立的分支,跟主分支完全独立,pull代码 ...
- JY播放器【QQ音乐破解下载】
今天给大家带来一款神器----JY播放器.可以直接下载QQ音乐的歌曲. 目前已经支持平台(蜻蜓FM.喜马拉雅FM.网易云音乐.QQ音乐) 使用方法: 在网页打开QQ音乐网站找到你要听的歌曲或歌单.复制 ...
- python-__getattr__ 和 __getattribute__
python3完全使用了新式类,废弃了旧式类,getattribute作为新式类的一个特性有非常奇妙的作用.查看一些博客和文章后,发现想要彻底理解getattr和getattribute的区别,实际上 ...