Django 【补充】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类型。

原文地址:https://www.cnblogs.com/xiaohema/p/8456307.html

时间: 2024-11-02 20:44:09

Django 【补充】ORM多对多正向查询的相关文章

django的 ORM 操作 增加和查询

ORM  对象关系映射 在数据库中,实现对数据的增删改查,使用的是SQ语句, 在django中,通过python代码,实现对数据库的增删改查,这就是ORM. 在python中,用类名  代表 django数据库的表名, 用对象 ,代表django数据库的一条记录, ORM 就是封装了SQ语句,给对象进行增删改查,实现对数据库的操作, 在settings 文件中,默认了splite的数据库,自己可以修改 DATABASES = { 'default': { 'ENGINE': 'django.db

Django中ORM多对多表的操作

自己创建第三张表建立多对多关系 表的创建 # 老师表和学生表可以是一个多对多的关系,建表时可以手动建立第三张表建立关联 class Student(models.Model): name = models.CharField(max_length=32, null=True) age = models.CharField(max_length=32, null=True) class Teacher(models.Model): name = models.CharField(max_lengt

Django值ORM

ORM(object relational mapping): 对象关系映射 映射关系: 表名 <-------> 类名 字段 <-------> 属性 表记录 <------->类实例对象 建立模型(model) 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关系(one-to-one) 出版商模型:出版商有名称,所在城市以及ema

ORM 单表操作查询 多表操作查询及增删改查

------------------------------------------只有对前途乐观的人,才能不怕黑暗,才能有力量去创造光明.乐观不是目的,而是人生旅途中的一种态度. 多表操作 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关系(one-to-one) 出版商模型:出版商有名称,所在城市以及email. 书籍模型: 书籍有书名和出版日期

Django的orm的高级操作

Django的orm的高级操作 查询语法大全: 比较运算符 # id > 3 res = models.UserInfo.objects.filter(id__gt=3) # id >= 3 res = models.UserInfo.objects.filter(id__gte=3) # id < 3 res = models.UserInfo.objects.filter(id__lt=3) # id <= 3 res = models.UserInfo.objects.fil

Django 的 orm 查询

一.模型关系表 1. 一对一 Author-AuthorDetail 关联字段可以在任意表下,但必须唯一约束.(unique约束) ad_id(unique约束) ad = models.oneToOneField("AuthorDetail",null=True,on_delete=models.CASCADE) 相当于 authors = models.ForgeinKey(to="Author",on_delete=models.CASCADE,unique)

python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)

12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_demo.settings") import django django.setup() # 启动Django项目 from app01 import models #返回QuerySet对象的方法: r

Django的ORM表查询

目录 Django的ORM表查询 单表查询 多表查询 聚合查询 分组查询 F与Q查询 Django的ORM表查询 先创建一个数据库,做前期准备 为了方便测试,不再进行urls对应关系和views的书写,直接测试的单个文件 那么如何只单独测试Django中的某个py文件,有以下方法 在任意一个py文件中书写以下代码 可以在应用app的目录下的tests.py中书写 也可以自己建立一个py文件书写 import os if __name__ == "__main__": os.enviro

Django学习【第7篇】:Django之ORM跨表操作(聚合查询,分组查询,F和Q查询等)

django之跨表查询及添加记录 一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);     一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many). 创建一对一的关系:OneToOne("要绑定关系的表名") 创建一对多的关系:ForeignKey("要绑定关系的表名") 创建多对多的关系:ManyToMany(&qu