一、多对多的正反向查询

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. 自己没有记住的一点小知识(ORM查询相关)

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

  2. ORM查询相关的操作

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

  3. 6月21日 Django ORM那些相关操作(表关联、聚合查询和分组查询)

    一.ForeignKey操作 正向查找 对象查找(跨表) 语法: 对象.关联字段.字段   示例: book_obj = models.Book.objects.first() # 第一本书对象 pr ...

  4. Django的ORM那些相关操作

    一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <> all(): 查询所有结果 <> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 & ...

  5. Django之ORM查询

    ORM 映射关系: 表名 <-------> 类名 字段 <-------> 属性 表记录 <------->类实例对象图书管理系统的增删改查:代码如下:views ...

  6. Django之ORM那些相关操作

    一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 ...

  7. Django ORM那些相关操作zi

    Django ORM那些相关操作   一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs) ...

  8. Python学习---ORM查询之基于对象的正向/反向/聚合/分组/Q/F查询

    ORM查询之基于对象的正向查询与反向查询 对象形式的查询 # 正向查询 ret1=models.Book.objects.first() print(ret1.title) print(ret1.pr ...

  9. Django框架 之 ORM查询操作详解

    Django框架 之 ORM查询操作详解 浏览目录 一般操作 ForeignKey操作 ManyToManyField 聚合查询 分组查询 F查询和Q查询 事务 Django终端打印SQL语句 在Py ...

随机推荐

  1. Python——Numpy的random子库

    NumPy的random子库 np.random.* np.random.rand() np.random.randn() np.random.randint() import numpy as np ...

  2. Linux系统BTC挖矿傻瓜教程

    [Linux系统BTC/比特币矿池挖矿方案一]cgminer矿池挖矿程序(Linux系统 比特币(BTC) 矿池挖矿/采矿/造币)cgminer矿池挖矿程序[查看这里有没有最新版]http://ck. ...

  3. Python运算和和表达式 学习笔记

    光荣之路Python公开课第二讲 Python运算符和表达式. 一 Python运算符 Python运算符包括 算术运算符,赋值运算符,位运算符,逻辑运算符,身份运算符,成员运算符. 1. 算术运算符 ...

  4. 双向链表(C++实现)

    ////////////////////////////////////////////////////////////////////////////////////// /////// 这里建立两 ...

  5. Linux查看外网IP

    Linux查看外网IP curl cip.cc curl ifconfig.me curl ipinfo.io

  6. 转 Java Classloader机制解析

    转 Java Classloader机制解析 发表于11个月前(2014-05-09 11:36)   阅读(693) | 评论(0) 9人收藏此文章, 我要收藏 赞1 慕课网,程序员升职加薪神器,点 ...

  7. Bootstrap(二)段落+强调内容

    在Bootstrap中为文本设置了一个全局的文本样式(这里所说的文本是指正文文本): 1.全局文本字号为14px(font-size). 2.行高为1.42857143(line-height),大约 ...

  8. java自动生成表单简单实例

    数据库表设置 tb_form(form表单) 字段 类型 约束 说明 Id Int 主键 主键 Formid Varchar2(20) 唯一 Form表单id的值 Action Varchar2(20 ...

  9. 列存储压缩技巧,除公共除数或者同时减去最小数,字符串压缩的话,直接去重后用数字ID压缩

    Column-store compression At a high level, doc values are essentially a serialized column-store. As w ...

  10. mysql基本语句1

    操作MySQL数据库 向表中插入数据 insert 语句可以用来将一行或多行数据插到数据库表中, 使用的一般形式如下: insert [into] 表名 [(列名1, 列名2, 列名3, ...)] ...