Tips:ForeignKey 定义在多的一方
OneToOneField 和 ManyToManyField 定义任何一方都可以
一对一
通过拓展表去获取学生的信息的话,语法如下;
学生拓展表的单条对象.关联字段,即可获取到学生表的数据
stu_info=Stuinfo.objects.filter(phone='12123124').first() #扩展表
stu = stu_info.stu #建立连接,拿到学生表对象
注意:通过学生获取关联表的数据的话,语法如下:
学生对象.关联的表名,即可获取到关联表的数据
stu = Student.objects.filter(name='小明').first()
stu_info = stu.stuinfo #建立连接,拿到扩展表对象
models.py
from django.db import models
学生表
class Student(models.Model):
name = models.CharField(max_length=10, unique=True)
age = models.IntegerField(default=18)
gender = models.BooleanField(default=1)
# auto_now_add创建数据时,默认create_time字段为当前时间
create_time = models.DateTimeField(auto_now_add=True, null=True)
# 修改的时间,每次update学生信息时,修改改字段的时间为当前时间
operate_time = models.DateTimeField(auto_now=True, null=True)
chinese = models.DecimalField(max_digits=3,decimal_places=1,null=True)
maths = models.DecimalField(max_digits=3,decimal_places=1,null=True)
class Meta:
# 指定Student模型映射到数据库中,对应的表名
db_table = 'student'
学生信息扩展表
class Stuinfo(models.Model):
phone = models.CharField(max_length=11)
adress = models.CharField(max_length=10)
# OneToOneField相当于 Foreignkey , unique = True
#这里把Stuinfo和Student连接了起来
通过Student.stuinfo拿到扩展表对象 Stuinfo.stu拿到学生表对象
stu = models.OneToOneField(Student)
class Meta:
db_table = 'stu_info'
views.py
通过学生查询扩展表信息
第一种
stu = Student.objects.filter(name='小明').first() #学生表
stu_info = Stuinfo.objects.filter(stu_id=stu.id).first()#建立连接,拿到扩展表对象
phone = stu_info.phone
第二种
stu = Student.objects.filter(name='小明').first()
stu_info = stu.stuinfo #建立连接,拿到扩展表对象
phone = stu_info.phone
通过电话号码查询学生信息
stu_info=Stuinfo.objects.filter(phone='12123124').first() #扩展表
stu = stu_info.stu #建立连接,拿到学生表对象
print(stu.name)
return HttpResponse(stu.name)
一对多
models.py
#班级表
class Grade(models.Model):
g_name = models.CharField(max_length=10)
create_time = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = 'grade'
#学生表
class Student(models.Model):
# Create your models here.
name = models.CharField(max_length=10, unique=True)
age = models.IntegerField(default=18)
gender = models.BooleanField(default=1)
# auto_now_add创建数据时,默认create_time字段为当前时间
create_time = models.DateTimeField(auto_now_add=True, null=True)
# 修改的时间,每次update学生信息时,修改改字段的时间为当前时间
operate_time = models.DateTimeField(auto_now=True, null=True)
chinese = models.DecimalField(max_digits=3,decimal_places=1,null=True)
maths = models.DecimalField(max_digits=3,decimal_places=1,null=True)
grade = models.ForeignKey(Grade,null=True)
class Meta:
# 指定Student模型映射到数据库中,对应的表名
db_table = 'student'
views.py
通过多的一方查一的一方(通过学生查班级)
单条对象.关联字段
stu=Student.objects.filter(name='lml').first()
grade=stu.grade
通过一的一方查多的一方(通过班级查学生)
查询对象.关联的表名小写_set (固定写法)
grade = Grade.objects.filter(g_name='python1').first()
stus = grade.student_set.all()
def add_grade(request):
Gname = ['python','java','php']
for name in Gname:
for i in range(1,5):
Grade.objects.create(g_name=name+str(i))
return HttpResponse('加入成功')
def sel_grade_by_stu(request):
stu=Student.objects.filter(name='lml').first()
grade=stu.grade
return HttpResponse('通过学生查班级')
def sel_stu_by_grade():
grade = Grade.objects.filter(g_name='python1').first()
stus = grade.student_set.all()
print(stus)
return HttpResponse('通过班级查学生')
多对多
通过人查找课程 ,并添加课程
stu=Student.objects.filter(name='lml').first()
stu.course_set.add(cou)
通过课程查找人 ,并添加人
cou=Course.objects.filter(c_name='线代').first()
cou.stu.add(stu)
tips:多对多与,一对多的一个小区别
多对一stu.grade没有all() 因为只有多个学生只有一个班级对象
多对多cou.stu.all()有all 因为多个课程对应多个学生
models.py
学生表
class Student(models.Model):
# Create your models here.
name = models.CharField(max_length=10, unique=True)
age = models.IntegerField(default=18)
gender = models.BooleanField(default=1)
# auto_now_add创建数据时,默认create_time字段为当前时间
create_time = models.DateTimeField(auto_now_add=True, null=True)
# 修改的时间,每次update学生信息时,修改改字段的时间为当前时间
operate_time = models.DateTimeField(auto_now=True, null=True)
chinese = models.DecimalField(max_digits=3,decimal_places=1,null=True)
maths = models.DecimalField(max_digits=3,decimal_places=1,null=True)
grade = models.ForeignKey(Grade,null=True)
class Meta:
# 指定Student模型映射到数据库中,对应的表名
db_table = 'student'
课程表
class Course(models.Model):
c_name = models.CharField(max_length=10)
stu = models.ManyToManyField(Student)
class Meta:
db_table = 'course'
views.py
def add_course(request):
cous =['线代','高数','物理','英语']
for c in cous:
coun = Course()
coun.c_name = c
coun.save()
return HttpResponse('创建班级成功')
def stu_cou(request):
stu=Student.objects.filter(name='lml').first()
cou=Course.objects.filter(c_name='线代').first()
# 通过人查找课程 ,并添加课程
stu.course_set.add(cou)
cou.stu.add(stu2)
return HttpResponse('添加和删除学生之间的关联关系')
网友评论