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 数据库操作(上)的更多相关文章

  1. Django 2.0 学习(16):Django ORM 数据库操作(下)

    Django ORM数据库操作(下) 一.增加表记录 对于表单有两种方式: # 方式一:实例化对象就是一条表记录france_obj = models.Student(name="海地&qu ...

  2. Django 2.0 学习(07):Django 视图(进阶-续)

    接Django 2.0 学习(06):Django 视图(进阶),我们将聚焦在使用简单的表单进行处理和精简代码. 编写简单表单 我们将用下面的代码,来替换之前的detail模板("polls ...

  3. Django【第5篇】:Django之ORM数据库操作

    django之ORM数据库操作 一.ORM介绍 映射关系: 表名 -------------------->类名 字段-------------------->属性 表记录-------- ...

  4. golang学习笔记16 beego orm 数据库操作

    golang学习笔记16 beego orm 数据库操作 beego ORM 是一个强大的 Go 语言 ORM 框架.她的灵感主要来自 Django ORM 和 SQLAlchemy. 目前该框架仍处 ...

  5. Django 2.0 学习(04):Django数据库

    数据库设置/配置 打开mysite/settings.py,我们会发现Django是用的是默认的数据库SQLite,如下图所示: Django也是支持其它数据库的,比如PostgreSQL.MySQL ...

  6. Django(三) ORM 数据库操作

    大纲 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 2.创建数据库 表结构 二.Django ORM基本增删改查 1.表数据增删改查 2.表结构修改 三.Django ORM 字段 ...

  7. Django入门4: ORM 数据库操作

    大纲 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 2.创建数据库 表结构 二.Django ORM基本增删改查 1.表数据增删改查 2.表结构修改 三.Django ORM 字段 ...

  8. django(六)之ORM数据库操作

    https://www.cnblogs.com/haiyan123/p/7732190.html 一.ORM介绍 ORM——object relation mapping 映射关系: 表名 ----- ...

  9. Django框架(八) Django之ORM数据库操作

    创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关系( ...

随机推荐

  1. GlusterFS学习之路(二)GlusterFS部署及卷类型使用

    一.环境说明 主机名 IP地址 角色 磁盘 gluster-node1 192.168.56.11 Server.Client /dev/sdb./dev/sdc./dev/sdd gluster-n ...

  2. svn 安装 配置及同步

    1.环境centos 2.安装svn #yum -y install subversion 3 查看版本 #svnserve --version 4 建立版本库目录 #mkdir /data/svnd ...

  3. 探寻ASP.NET MVC鲜为人知的奥秘(2):与Entity Framework配合,让异步贯穿始终

    Why 在应用程序,尤其是互联网应用程序中,性能一直是很多大型网站的困扰,由于Web2.0时代的到来,人们更多的把应用程序从C/S结构迁移到B/S结构,这样会带来客户端轻量,部署.试试方便快捷等优势, ...

  4. macOS中启动Tomcat提示Cannot find ./catalina.sh

    首先查看Tomcat目录下是否存在catalina.sh,如果文件不存在,文件丢失,最好的方式是重装Tomcat Tomcat官网:http://tomcat.apache.org/ 如果文件存在,那 ...

  5. Linux☞如何修改文件权限

    修改文件/目录的权限:chmod  规则 文件/目录名 规则: 角色:u 自己人  user g 同组人 group         o 其他人 other a 所有人 all 操作: + - 权限 ...

  6. 数据库sql优化总结之2-百万级数据库优化方案+案例分析

    项目背景 有三张百万级数据表 知识点表(ex_subject_point)9,316条数据 试题表(ex_question_junior)2,159,519条数据 有45个字段 知识点试题关系表(ex ...

  7. Eclipse用java.util.Scanner时出现Resource leak: 'in' is never closed

    Resource leak: 'in' is never closed : 直译为资源泄漏,‘in’一直没被关闭. 由于声明了数据输入扫描仪(Scanner in),从而获得了配置内存,但是结束时却没 ...

  8. Python基础灬异常

    异常&异常处理 异常!=错误 在程序运行过程中,总会遇到各种各样的错误. 有的错误是程序编写有问题造成的,比如本来应该输出整数结果输出了字符串,这种错误我们通常称之为bug,bug是必须修复的 ...

  9. Amazon移除差评适用范围 - Amazon request for the feedback removal

    Greetings from Amazon Seller Support, Please accept my sincere apologies for the inconvenience cause ...

  10. linux 性能分析命令及其解释

    很多时候,我们需要对linux上运行的环境大体有一个了解,那么久需要大体知道当前系统的相关资源的使用情况,那么可以用一些linux提供的丰富的命令来查看 性能分析 vmstat 虚拟内存统计 用法 U ...