1、多对多的正向查询

  1. class Class(models.Model):
  2. name = models.CharField(max_length=32,verbose_name="班级名")
  3. course = models.CharField(verbose_name="课程",max_length=32)
  4. def __str__(self):
  5. return self.name
  6.  
  7. class Teacher(models.Model):
  8. name = models.CharField(max_length=23,verbose_name="姓名")
  9. classes = models.ManyToManyField(verbose_name="所属班级",to="Class")
  10. def __str__(self):
  11. 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)

注意:要说明的是多对多的查询用.all,,查单个的时候用.values或者values_list,不要用obj.classes.name,,这样查到的会是None,反向查询也是如此。我就是犯了这样的错,引以为戒。。

总结:不管是一对多,还是多对多,要是查询多得一方就得用all()

运行结果截图:

2、多对多的反向查询

1.表结构:

  1. from django.db import models
  2.  
  3. # Create your models here.
  4. # 一个学生有一个班级,一个班级可以有好多学生,所以是
  5. # 一对多的关系,关联字段放在多的一方
  6. class Student(models.Model):
  7. name = models.CharField(max_length=32,verbose_name="姓名")
  8. age = models.IntegerField(verbose_name="年龄")
  9. classes = models.ForeignKey(to="Class",verbose_name="所属班级")
  10. def __str__(self):
  11. return self.name
  12.  
  13. class Class(models.Model):
  14. name = models.CharField(max_length=32,verbose_name="班级名")
  15. course = models.CharField(verbose_name="课程",max_length=32)
  16. def __str__(self):
  17. return self.name
  18.  
  19. class Teacher(models.Model):
  20. name = models.CharField(max_length=23,verbose_name="姓名")
  21. classes = models.ManyToManyField(verbose_name="所属班级",to="Class")
  22. def __str__(self):
  23. return self.name

2、查询海燕在那个班级

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

3、查询海燕所在班的老师的姓名

  1. print("海燕所在班的老师的姓名",models.Student.objects.filter(name="海燕").values("classes__teacher__name"))

4、查询软件测试151班的所有学生的姓名

  1. print("软件测试151班的所有学生的姓名",models.Class.objects.filter(name="软件测试151").values("student__name"))
  2. obj = models.Class.objects.filter(name="软件测试151").first()
  3. # print("软件测试151班的所有学生的姓名",obj.student_set.name) #这样打印的结果是None
  4. print("软件测试151班的所有学生的姓名",obj.student_set.all().values("name"))

二、需要掌握的一个很重要的知识点

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

  <button class="login" type="button">注册</button>

  1. <button type="button" onclick="doValidation();">提交</button>
  2. <input type="button" onclick="doValidation();" value="提交"/>
  3. 上面两种写法是对的,功能一样。
  4.  
  5. <button onclick="doValidation();">提交</button>
  6. 如果写成这种,默认为submit,本来doValidation方法里有提交功能了,
  7. 再加上按钮也是提交功能,会提交两次。所以使用按钮时最好指定type类型。

Django框架----ORM数据库操作注意事项的更多相关文章

  1. Django框架----ORM数据库操作

    一.ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用 ...

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

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

  3. django之ORM数据库操作

    一.ORM介绍 映射关系: 表名 -------------------->类名 字段-------------------->属性 表记录----------------->类实例 ...

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

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

  5. django框架ORM数据库

    字段类型 选项 null是数据库范畴的概念,blank是表单验证范畴的 外键 在设置外键时,需要通过on_delete选项指明主表删除数据时,对于外键引用表数据如何处理,在django.db.mode ...

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

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

  7. Django框架之数据库ORM框架

    首先,我来介绍一下什么是ORM框架: O是object,也就类对象的意思,R是relation,翻译成中文是关系,也就是关系数据库中数据表的意思,M是mapping,是映射的意思.在ORM框架中,它帮 ...

  8. Django 2.0 学习(14):Django ORM 数据库操作(上)

    Django ORM 数据库操作(上) ORM介绍 映射关系: 数据库表名 ---------->类名:数据库字段 ---------->类属性:数据库表一行数据 ----------&g ...

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

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

随机推荐

  1. [js]js中6种错误处理机制

    js中6种错误 http://javascript.ruanyifeng.com/grammar/error.html#toc5 https://www.jianshu.com/p/467b9a145 ...

  2. 建模:通过ES平铺关系型数据库多表的数据

    问:建模要从一个限界上下文中来建模,是否可以简单的把几张表进行笛卡尔乘积方式的平铺? 答:不能,原因之一,数据量会急剧增长:原因之二,这样的平铺是毫无意义的,必须要定义一个维度,在这个维度上根据需求约 ...

  3. 特征选择:Filter/Wrapper/Embedded

    一.特征的来源 在做数据分析的时候,特征的来源一般有两块,一块是业务已经整理好各种特征数据,我们需要去找出适合我们问题需要的特征:另一块是我们从业务特征中自己去寻找高级数据特征.我们就针对这两部分来分 ...

  4. [pat]A1072 Gas Station

    这道题的结点编号是字符串类型,处理的过程很有意思,用getID将house和GasStation进行区分 #include<bits/stdc++.h> using namespace s ...

  5. Mac使用数据线连接ios,安装deb

    原创http://www.cnblogs.com/fply/p/8478702.html mac连接ios mac连接ios需要用到usbmuxd,这个可自行下载 到python-client目录下, ...

  6. cocos2d-x C++ (Android)集成第三方微信分享

    ShareSDK Android for cocos2d-x 此文档为ShareSDK Android for cocos3.x的版本,如您集成的是2.X的版本文档请到这里:cocos2.x集成文档 ...

  7. node.js初识10

    post请求 form.html <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  8. VS 星期作业 if else的应用 做一个受不受异性欢迎的小程序

    static void Main(string[] args) { //漏掉代码 输入错误 进行提示! string T1, T2, T3, T4, T5, T6, T7, T8, T9, T10=& ...

  9. (1)打造简单OS-汇编写入引导区,虚拟机启动步骤

    首先需要您在网上下载NASM编译器,可以将汇编编译为二进制文件 1.写一段汇编代码在屏幕上打印一段字符,可以运行的!并进行nasm为二进制文件,如下"test.asm" 该段汇编主 ...

  10. 学习笔记<3>View接触

    一.View基本概念 1.界面上显示所有的控件都是用对象表示的,即有类,这些类都是View的子类. 2.View的种类 二.在Activity当中获取代表View的对象 1.根据ID可以用方法获取到对 ...