Django ORM 数据库操作(上)

ORM介绍

映射关系:

数据库表名 ---------->类名;数据库字段 ---------->类属性;数据库表一行数据 ---------->类实例化对象;

ORM两大功能:

操作表:创建、修改、删除表;

操作数据:增删改查;

ORM利用pymysql第三方工具连接数据库,Django无法帮助我们创建数据库,只能我们创建完成后告诉它,让Django去连接;

创建表之前的准备工作

1.自己创建数据库;

2.在settings.py文件中配置mysql数据库连接,sqlite3改为mysql:

  1. # 修改django默认sqlite3数据库为mysql
  2. DATABASES = {
  3. 'default': {
  4. 'ENGINE': 'django.db.backends.mysql',
  5. 'NAME': 'mydatabase',
  6. 'USER': 'mydatabaseuser',
  7. 'PASSWORD': 'mypassword',
  8. 'HOST': '127.0.0.1',
  9. 'PORT': '3306',
  10. }
  11. }

修改project中的__init__.py文件,设置Django默认连接MySQL的方式:

  1. import pymysql
  2. pymysql.install_as_MySQLdb()

3.创建数据库表

打开models.py文件,写入如下代码:

  1. class Question(models.Model):
  2. question_text = models.CharField(max_length=200)
  3. pub_date = models.DateTimeField('date published')
  4. models.DateField()
  5. def __str__(self):
  6. return self.question_text

执行命令创建

  1. python manage.py makemigrations 创建脚本
  2. python manage.py migrate 数据迁移

4.查看数据库的sql语句(家在settings.py文件中)

  1. # 查看数据库执行代码
  2. LOGGING = {
  3. 'version': 1,
  4. 'disable_existing_loggers': False,
  5. 'handlers': {
  6. 'console': {
  7. 'level': 'DEBUG',
  8. 'class': 'logging.StreamHandler',
  9. },
  10. },
  11. 'loggers': {
  12. 'django.db.backends': {
  13. 'handlers': ['console'],
  14. 'propagate': True,
  15. 'level': 'DEBUG',
  16. },
  17. }
  18. }

多对多的正反向查询

在models.py文件中的模型如下:

  1. class Class(models.Model):
  2. name = models.CharField(max_length=32, verbose_name='班级名称')
  3. course = models.CharField(max_length=32, verbose_name='课程')
  4. def __str__(self):
  5. return self.name
  6. class Teacher(models.Model):
  7. name = models.CharField(max_length=32, verbose_name='姓名')
  8. classes = models.ManyToManyField(verbose_name='所属班级', to='Class')
  9. def __str__(self):
  10. return self.name

题目1:查找吴老师所带班级

  1. # 方式一:基于对象的查找
  2. obj = models.Teacher.objects.filter(name="吴老师").first()
  3. print(obj.classes.all())
  4. print("吴老师带的班级",obj.classes.values("name"))
  5. # 方式二:基于双下划线的查找
  6. obj_cls = models.Teacher.objects.filter(name="吴老师").values("classes__name")
  7. print("吴老师带的班级",obj_cls)

注意:查询单个的时候用.values或者value_list,不要用obj.classes.name,这样查询到的会是None,反向查询也是如此,不管是一对多,还是多对多,查询多的一方就用.all()方法

运行结果(非此例结果):

表结构:

  1. # 一个学生有一个班级,每个班级有好多学生,所以是多对一的关系,关联字放在多的一方
  2. class Student(models.Model):
  3. name = models.CharField(max_length=32, verbose_name='姓名')
  4. age = models.IntegerField(verbose_name='年龄')
  5. classes = models.ForeignKey(verbose_name='所属班级', to='Class')
  6. def __str__(self):
  7. return self.name
  8. class Class(models.Model):
  9. name = models.CharField(max_length=32, verbose_name='班级名称')
  10. course = models.CharField(max_length=32, verbose_name='课程')
  11. def __str__(self):
  12. return self.name
  13. class Teacher(models.Model):
  14. name = models.CharField(max_length=32, verbose_name='姓名')
  15. classes = models.ManyToManyField(verbose_name='所属班级', to='Class')
  16. def __str__(self):
  17. return self.name

题目2.陈凡在哪个班级

  1. # 方式一:
  2. print("陈凡所在班级:", models.Student.objects.filter(name="陈凡").values("classes__name")
  3. # 方式二:
  4. obj_class = models.Student.objects.filter(name="陈凡").first()
  5. print("陈凡所在班级:", obj_class.classes.name)

题目3.查询陈凡所在班级的老师姓名

  1. print("陈凡所在班级老师的姓名:", models.Student.objects.filter(name="陈凡").values("classes__teacher__name)

题目4.查询高三2班所有学生姓名

  1. print("高三2班所有学生姓名", models.Class.object.filter(name="高三2班").values("student__name")
  2. object_class = models.Class.object.filter(name="高三2班").first()
  3. print("高三2班所有学生姓名", object_class.student_set.all().values("name"))
  4. # print("高三2班所有学生姓名", object_class.student_set.name) 这样打印的结果是None

重要知识点

form表单中要用submit,如果用button切记要加上type,不然button默认的type是submit,会有影响:

  1. <button type="button" onclick="doValidation();">提交</button>
  2. <input type="button" onclick="doValidation();" value="提交" />
  3. // 上面两种写法是对的,功能一样
  4. <button onclick="doValidation();">提交</button>
  5. // 如果写成这种,默认为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. 【LG5019】[NOIP2018]道路铺设

    [LG5019][NOIP2018]道路铺设 题面 洛谷 题解 \(NOIP\) 抄 \(NOIP\)差评 设当前做到了位置\(i\) 且\(h_i\) \(-\) \(h_i\)\(_+\)\(_1 ...

  2. Azkaban系统的安装和分析。

    Azkaban系统是一个数据处理的很好用的工具,可以用来运行hadoop任务,管理hdfs,可以进行schedule任务调度,总体来说功能还是很强大的. 研究了一下azkaban,做了以下总结性的东西 ...

  3. c++编译器处理 函数返回值

    X bar() { X xx; return xx; } // compiler generated temporary X __temp0; ( bar( __temp0 ), __temp0 ). ...

  4. C#Framework4.0支持异步async/await语法

    由于用户使用的是XP系统,但是程序里异步都是通过async/await代码来实现的,然而async/await需要Framework4.5版本才可以,而XP系统最高只能支持到Framework4.0, ...

  5. selenium自动化之定位多个元素

    前面我们讲的都是如何定位单个元素,下面讲下怎么去定位多个元素,并且输出文本. 以百度为例:获取标红的这一组元素的文本 这里我用到的是xpath来定位的://div[@id="u1" ...

  6. Siki_Unity_3-16_3D数学基础

    Unity 3-16 3D数学基础 任务0-1:课程介绍 课程大纲: 1. 3D数学介绍 2. Unity中的几种坐标系: 全局坐标系.屏幕坐标系等 坐标系间的坐标转换:比如屏幕坐标转换到世界坐标 3 ...

  7. 运输层(TCP/UDP)详解

    TCP和UDP的区别: tcp是面向连接的可靠的传输协议 udp是非连接的不可靠的传输协议 TCP组成 可以看到虽然tcp是面向字节流的,但是其传输的基本单位还是报文(tcp首部和数据,ip报文和ud ...

  8. (转)ASP.NET Core 性能对比评测(ASP.NET,Python,Java,NodeJS)

    转:https://www.cnblogs.com/savorboard/archive/2016/10/17/dotnet-benchmarks.html 前言 性能是我们日常生活中经常接触到的一个 ...

  9. 解决登录linux输入密码问题

    1.使用密钥 ssh-keyssh -i .ssh/*.key root@<ip_addr> 2.使用sshpass 安装 rpm 包:yum install sshpass 配置文件: ...

  10. String中intern()方法

    intren方法:通俗的讲,是将字符串放入常量池中. new出来的字符串是放在堆中,直接赋值的字符串是放在常量池中的. 对字符串做拼接操作,即做“+”运算,分两种情况 (1)表达式右边是纯字符串常量, ...