自己没有记住的一点小知识(ORM查询相关)
一、多对多的正反向查询
class Class(models.Model):
name = models.CharField(max_length=32,verbose_name="班级名")
course = models.CharField(verbose_name="课程",max_length=32)
def __str__(self):
return self.name class Teacher(models.Model):
name = models.CharField(max_length=23,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)
注意:要说明的是多对多的查询用.all,,查单个的时候用.values或者values_list,不要用obj.classes.name,,这样查到的会是None,反向查询也是如此。我就是犯了这样的错,引以为戒。。
总结:不管是一对多,还是多对多,要是查询多得一方就得用all()
运行结果截图:

表结构:
from django.db import models # Create your models here.
# 一个学生有一个班级,一个班级可以有好多学生,所以是
# 一对多的关系,关联字段放在多的一方
class Student(models.Model):
name = models.CharField(max_length=32,verbose_name="姓名")
age = models.IntegerField(verbose_name="年龄")
classes = models.ForeignKey(to="Class",verbose_name="所属班级")
def __str__(self):
return self.name class Class(models.Model):
name = models.CharField(max_length=32,verbose_name="班级名")
course = models.CharField(verbose_name="课程",max_length=32)
def __str__(self):
return self.name class Teacher(models.Model):
name = models.CharField(max_length=23,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_cls = models.Student.objects.filter(name="海燕").first()
print("海燕所在的班级",obj_cls.classes.name)
3、查询海燕所在班的老师的姓名
print("海燕所在班的老师的姓名",models.Student.objects.filter(name="海燕").values("classes__teacher__name"))
4、查询软件测试151班的所有学生的姓名
print("软件测试151班的所有学生的姓名",models.Class.objects.filter(name="软件测试151").values("student__name"))
obj = models.Class.objects.filter(name="软件测试151").first()
# print("软件测试151班的所有学生的姓名",obj.student_set.name) #这样打印的结果是None
print("软件测试151班的所有学生的姓名",obj.student_set.all().values("name"))
二、需要掌握的一个很重要的知识点
1、form表单中要用submit,如果用button切记要加上type,不然button默认的type是submit,会有影响
<button class="login" type="button">注册</button>
<button type="button" onclick="doValidation();">提交</button>
<input type="button" onclick="doValidation();" value="提交"/>
上面两种写法是对的,功能一样。 <button onclick="doValidation();">提交</button>
如果写成这种,默认为submit,本来doValidation方法里有提交功能了,
再加上按钮也是提交功能,会提交两次。所以使用按钮时最好指定type类型。
自己没有记住的一点小知识(ORM查询相关)的更多相关文章
- Character literal must contain exactly one character -- 一天一点小知识
编程语言高度抽象化以后,错误也越来越让人难以理解了, NET编程最常见的一个错误, Object not set to the reference ,过了好久,才明白过来, 就是不明白为啥微软不说 ...
- 关于C#的一点小知识 以后自己用
项目过程中遇到C#代码的编写 上网查之后的结果 @html.ActionLink的几种参数格式 一 Html.ActionLink("linkText","actionN ...
- Python中json一点小知识
import json dic={ "name":"杨林" } ret=json.dumps(dic,ensure_ascii=False) #因为json.d ...
- js调试的一点小知识
1.如果想要js代码被XHTML和HTML解析,就可以使用如下方式 <script type="text/javascript"> //<![CDATA[ fun ...
- Numpy中的一点小知识
train_set_x_orig, train_set_y, test_set_x_orig, test_set_y, classes = load_dataset()train_set_x_orig ...
- python小知识-属性查询优先级(如果有同名类属性、数据描述符、实例属性存在的话,实例>类>数据描述符)
https://www.cnblogs.com/Jimmy1988/p/6808237.html https://segmentfault.com/a/1190000006660339 https:/ ...
- ORM查询相关
一.多对多的正反向查询 class Class(models.Model): name = models.CharField(max_length=32,verbose_name="班级名& ...
- ORM查询相关的操作
必知必会13条 import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_practice.setti ...
- JS框架设计读书笔记之-小知识
这一篇写一点小知识 JS中0.1+0.2为什么不等于0.3? 关于这个问题之前也很疑虑,老师也只是笼统的讲这是JS的语言问题,但是内部具体的情况却没有讲,看了书才发现原理如此简单. 简单来讲,计算机识 ...
随机推荐
- 如何将vue/html在Hbuilder里进行apk打包封装生成直接可用程序
在此简单讲述一下个人的理解: 方法: 对于Hbuilder里的项目文件: 1.直接右键:转换成移动app,然后生成一个json文件manifest.json,在该json文件下配置好应用程序的图标.和 ...
- 2017-2018-2 165X 『Java程序设计』课程 团队项目备选题目
2017-2018-2 165X 『Java程序设计』课程 团队项目备选题目 结合本课程时间安排,以及同学们的专业和课程内容,制定了以下六个题目供各小组选择.如有其他项目方案设想,可自行与老师沟通.老 ...
- Django学习手册 - ORM 数据创建/表操作 汇总
ORM 查询的数据类型: QuerySet与惰性机制(可以看作是一个列表) 所谓惰性机制:表名.objects.all()或者.filter()等都只是返回了一个QuerySet(查询结果集对象),它 ...
- Microsoft SQL - 学习总目录
Microsoft SQL - 数据库管理系统 Microsoft SQL - 数据类型 Microsoft SQL - 查询与更新 Microsoft SQL - 操作语句 Microsoft SQ ...
- cmder使用简介
简介 cmder是一个增强型命令行工具,不仅可以使用windows下的所有命令,更爽的是可以使用linux的命令,shell命令. 下载 官网地址:http://cmder.net/ 下载的时候,会有 ...
- POJ 1236 Network of Schools 连通图缩点
题目大意:有向图连通图,第一问求至少需要多少个软件才能传输到所有学校,第二问求至少需要增加多少条路使其成为强连通图 题目思路:利用Tarjan算法经行缩点,第一问就是求缩点后入度为0的点的个数(特殊情 ...
- android studio设置窗口颜色和字体
1.设置左边窗口颜色和字体: 设置中间代码编辑窗口:
- SpringBoot单元测试示例2
package cn.coreqi.security.controller; import org.junit.Before; import org.junit.Test; import org.ju ...
- VC 为程序创建快捷方式的详细讲解
有时候,为了方便用户使用我们编写的程序,需要在桌面,快速启动或程序组中创建程序的快捷方式.下面就介绍在VC下如何为程序创建快捷方式. 一.得到桌面,快速启动或程序组的路径这里介绍二个win32 API ...
- 洛谷 P4948 拉格朗日多项式插值(杜老师板子)
https://www.luogu.org/problemnew/show/P4948 这篇博客主要目的是存一下的dls的神奇板子,本来应该是推公式或者二分做的 但是dls的插值板子直接写好了这个特殊 ...