一、多对多的正反向查询

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查询相关)的更多相关文章

  1. Character literal must contain exactly one character -- 一天一点小知识

    编程语言高度抽象化以后,错误也越来越让人难以理解了, NET编程最常见的一个错误, Object not set to the reference ,过了好久,才明白过来, 就是不明白为啥微软不说   ...

  2. 关于C#的一点小知识 以后自己用

    项目过程中遇到C#代码的编写 上网查之后的结果 @html.ActionLink的几种参数格式 一 Html.ActionLink("linkText","actionN ...

  3. Python中json一点小知识

    import json dic={ "name":"杨林" } ret=json.dumps(dic,ensure_ascii=False) #因为json.d ...

  4. js调试的一点小知识

    1.如果想要js代码被XHTML和HTML解析,就可以使用如下方式 <script type="text/javascript"> //<![CDATA[ fun ...

  5. Numpy中的一点小知识

    train_set_x_orig, train_set_y, test_set_x_orig, test_set_y, classes = load_dataset()train_set_x_orig ...

  6. python小知识-属性查询优先级(如果有同名类属性、数据描述符、实例属性存在的话,实例>类>数据描述符)

    https://www.cnblogs.com/Jimmy1988/p/6808237.html https://segmentfault.com/a/1190000006660339 https:/ ...

  7. ORM查询相关

    一.多对多的正反向查询 class Class(models.Model): name = models.CharField(max_length=32,verbose_name="班级名& ...

  8. ORM查询相关的操作

    必知必会13条 import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_practice.setti ...

  9. JS框架设计读书笔记之-小知识

    这一篇写一点小知识 JS中0.1+0.2为什么不等于0.3? 关于这个问题之前也很疑虑,老师也只是笼统的讲这是JS的语言问题,但是内部具体的情况却没有讲,看了书才发现原理如此简单. 简单来讲,计算机识 ...

随机推荐

  1. Karel版本的nnet1

    除了chain,nnet1, nnet2, nnet3训练时调整转移模型,chain模型使用类似与MMI的训练准则 概要 Karel Vesely的nnet1用到以下技术: 每一层进行预训练,基于RB ...

  2. LOJ #2196「SDOI2014」LIS

    直接退流复杂度好优越啊 LOJ #2196 题意 一段数列,每个点有点权$ A_i$,删除代价$ B_i$,附加属性$ C_i$ 求最小代价使得$ LIS$长度发生变化,且输出一种$ C_i$字典序最 ...

  3. LOJ#2127「HAOI2015」按位或

    用$ Min-Max$容斥之后要推的东西少了好多 无耻的用实数快读抢了BZOJ.Luogu.LOJ三个$ OJ$的Rank 1 即将update:被STO TXC OTZ超了QAQ 题意:集合$ [0 ...

  4. Python 的异步 IO:Asyncio 简介

    转载自https://segmentfault.com/a/1190000008814676 好文章 所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时, ...

  5. linux 备份与恢复

  6. MySql cmd下的学习笔记 —— 有关修饰器的知识(trigger)

    关于触发器的理解: 进行数据库应用软件的开发时,有时我们碰到表的某些数据的改变时,希望同时 引起其他相关数据改变的需求,利用触发器就能满足这样的需求. 触发器能在表中的某些特定数据变化时自动完成某些查 ...

  7. PL/SQL 加字段 修改数据库之后 之后记得保存脚本

  8. Vue获取事件源

    设置事件源 <label :data-weight="item1.EvaluateWeight" @click='radioClick' :data-id="ite ...

  9. 关于DateTime自带的AddSeconds等函数的坑

    在此记录一下今天在写一个进程查杀小程序时碰到的关于DateTime的问题:  第一次是用AddSeconds后的时间直接和DateTime.Now做相等判断. class Program { stat ...

  10. BZOJ3224/LOJ104 普通平衡树 treap(树堆)

    您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x2. 删除x(若有多个相同的数,因只删除一个)3. 查询x的排名(若有多个相同的数,因输出最小的排名)4. 查询排名为x的数5. ...