1.models.py
from django.db import models
class Teachers(models.Model):
name = models.CharField(max_length=32)
class Classes(models.Model):
title = models.CharField(max_length=32)
#自定义关联表
class Teacher2Class(models.Model):
teacher = models.ForeignKey('Teachers',on_delete=None)
cls = models.ForeignKey('Classes',on_delete=None)
2.views.py
from django.shortcuts import render,HttpResponse
from app01 import models
def test(request):
# #添加老师姓名
# obj1 = [
# models.Teachers(name='小明'),
# models.Teachers(name='小红'),
# models.Teachers(name='小方'),
# ]
# #批量添加,每次最多5个
# models.Teachers.objects.bulk_create(obj1,5)
#
# #添加班级
# models.Classes.objects.create(title='全栈1期')
# models.Classes.objects.create(title='全栈2期')
# models.Classes.objects.create(title='全栈3期')
# models.Classes.objects.create(title='全栈4期')
# #关联表添加老师id和班级id
# models.Teacher2Class.objects.create(teacher_id=1,cls_id=1)
# models.Teacher2Class.objects.create(teacher_id=1,cls_id=2)
# models.Teacher2Class.objects.create(teacher_id=2,cls_id=2)
# models.Teacher2Class.objects.create(teacher_id=2,cls_id=4)
# models.Teacher2Class.objects.create(teacher_id=3,cls_id=4)
# models.Teacher2Class.objects.create(teacher_id=3,cls_id=3)
#查询小明老师教哪几个班级,有4种方法:
#推荐使用第四种方法,第一二种方法每循环一次就发一次查询请求,拖慢速度。
#1.从Teacher2Class表中过滤出连表的姓名是小明的行列表,teacher、cls是外键
row_list = models.Teacher2Class.objects.filter(teacher__name='小明')
for row in row_list:
print(row.cls.title)#该行连表找到班级
#2.从Teachers表中过滤出姓名是小明的行
obj = models.Teachers.objects.filter(name='小明').first()
#找到该行跟关联表对应的行列表
row_list = obj.teacher2class_set.all()
for row in row_list:
print(row.cls.title)
#3.从Teacher2Class表中过滤出连表的姓名是小明的行,并且找到连表名是title的字典列表
dic_list = models.Teacher2Class.objects.filter(teacher__name='小明').values('cls__title')
for row in dic_list:
print(row['cls__title'])
# id teacher_id cls_id cls__title
# 1 1 1 全栈一期
# 2 1 2 全栈二期
#4.从关联表Teacher2Class中过滤出连表名是小明的行,并且通过外键cls连接上Classes表
row_list = models.Teacher2Class.objects.filter(teacher__name='小明').select_related('cls')
for row in row_list:
print(row.cls.title)
return HttpResponse('...')