python测试开发django-38.ManyToMany查询
时间:2022-06-20
本文章向大家介绍python测试开发django-38.ManyToMany查询,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言
一个学生可以对应多个老师,一个老师也可以教多个学生,这就是一种多对多的关系
models建表
新建一个老师表Teacher,和一个学生表Student
class Teacher(models.Model):
'''老师表'''
teacher_name = models.CharField(max_length=30, verbose_name="老师", default="")
tel = models.CharField(max_length=30, verbose_name="电话", default="")
mail = models.CharField(max_length=30, verbose_name="邮箱", default="")class Meta:
verbose_name = "老师"
verbose_name_plural = verbose_name
def __str__(self):
return self.teacher_nameclass Student(models.Model):
'''学生表'''
student_id = models.CharField(max_length=30, verbose_name="学号", default="")
name = models.CharField(max_length=30, verbose_name="姓名", default="")
age = models.IntegerField(verbose_name="年龄", default="")
# 多对多
teachers = models.ManyToManyField(Teacher, verbose_name="老师")class Meta:
verbose_name = "学生"
verbose_name_plural = verbose_namedef __str__(self):
return self.name
之后执行 makemigrations 和migrate,同步数据
python manage.py makemigrations python manage.py migrate
同步之后数据库里面会新增三张表:student、teacher、student_teachers
shell模式新增数据
为了调试方便,可以使用django的shell模式,对表的数据增删改查操作,打开cmd,cd到manage.py目录
python manage.py shell
多对多表的增加数据
>>> from hello.models import Teacher, Student
>>> t1=Teacher.objects.create(teacher_name='刘老师',tel='155300001111',mail='1000@qq.com')
>>> t1.save()
>>> t1
<Teacher: Teacher object (1)>
>>> t2=Teacher.objects.create(teacher_name='万老师',tel='155300001112',mail='1001@qq.com')
>>> t2.save()
>>> t2
<Teacher: Teacher object (2)>
>>> s1=Student.objects.create(student_id='11002200',name='张三',age=19)
>>> s1.save()# 方法一:添加id
# 可以添加Teacher对应的id
>>> s1.teachers.add(1)
# 也可以添加多个id,逗号隔开
>>> s1.teachers.add(1,2)
# 如果添加的是传一个可迭代对象(list或tupule),可以用*分开传入这种方法
>>> s1.teachers.add(*[1,2])# 方法二、直接添加对象
>>> s1.teachers.add(t1)
>>> s1.teachers.add(t2)
>>> s1.teachers.add(t1,t2)# 也可以先查询需要添加的对象
>>> ob=Teacher.objects.get(teacher_name='刘老师')
>>> ob
<Teacher: Teacher object (1)>
>>> s2=Student.objects.create(student_id='11002201',name='李四',age=19)
>>> s2.teachers.add(ob)
正向查询
通过student表对象,查询到对应的teacher
>>> from hello.models import Teacher, Student
>>> stu=Student.objects.filter(name='李四').first()
>>> stu
<Student: Student object (2)>
>>> stu.student_id
'11002201'# 正向查询
>>> stu.teachers.all()
<QuerySet [<Teacher: Teacher object (1)>]>>>> stu.teachers.all()[0].teacher_name
'刘老师'
>>> stu.teachers.all()[0].tel
'155300001111'
反向查询_set
通过老师名称,查询对应关联的学生,反向查询的时候在关联表名称后面加_set,如果设置related_name参数,就用related_name参数对应名称查询 参考上一篇https://www.cnblogs.com/yoyoketang/p/10573218.html
>>> tea=Teacher.objects.filter(teacher_name='刘老师').first()
>>> tea
<Teacher: Teacher object (1)>
>>> tea.tel
'155300001111'# 反向查询
>>> tea.student_set.all()
<QuerySet [<Student: Student object (1)>, <Student: Student object (2)>]>
>>> tea.student_set.all()[0].name
'张三'
>>>
xamdin注册表
# adminx.py
import xadmin
from .models import Card, CardDetail, Teacher, Studentclass ControlTeacher(object):
# 显示的字段
list_display = ["teacher_name", "tel", "mail"]class ControlStudent(object):
# 显示的字段
list_display = ('student_id', 'name', 'age', '老师')# # 定义一个方法,遍历book的auth,然后用列表返回
def 老师(self, obj):
return [x.teacher_name for x in obj.teachers.all()]xadmin.site.register(Teacher, ControlTeacher)
xadmin.site.register(Student, ControlStudent)
xadmin后台显示效果
- 轻松掌握ES6中集合Set的用法
- 萌新刷题(十三)买卖股票的最佳时机
- 萌新刷题(十一)有效数字
- Hive性能优化统计每日IP CREATE TABLE ip_2014_12_29 AS SELECT COUNT(DISTINCT ip) AS IP FROM logdfs WHERE logda
- 算法中描述复杂度的大O是什么意思?
- 优化Mysql:3个简单的调整
- Redis的5个常见应用场景
- Mysql 索引你了解多少?
- Mysql 8 新特性 window functions 有什么用?
- 用两张图告诉你,为什么你的App会卡顿?
- MapReduce设计模式
- 一个Sqrt函数引发的血案
- 小程序优秀开发资源
- Redis 新数据结构 - Streams
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- linux中叹号命令(!)的使用小结
- ubuntu下rz/sz命令的安装与使用说明
- Linux环境变量配置的完整攻略
- linux中使用boost.python调用c++动态库的方法
- linux下pip的安装步骤及使用详解
- CentOS7安装配置 Redis的方法步骤
- Linux下Oracle如何导入导出dmp文件详解
- Linux中samba服务器的搭建教程
- linux环境搭建图数据库neo4j的讲解
- Linux编程之ICMP洪水攻击
- linux搭建squid代理服务器的完整步骤
- 使用wget递归镜像网站
- 整理Linux中字符串的相关操作技巧
- Ubuntu 16.04下无法安装.deb的解决方法
- 关于linux中系统输入输出的管理详解