day04 -关系的一对一 一对多 多对多

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('添加和删除学生之间的关联关系')
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 切换到创建项目的目录 cd C:\Users\admin\Desktop\DjangoProject创建名为pr...
    在努力中阅读 3,314评论 2 3
  • Web框架之Django: (1)简介: Django是一个由Python写成开源的重量级Web应用框架,采用MT...
    老肖阅读 3,077评论 0 18
  • 22年12月更新:个人网站关停,如果仍旧对旧教程有兴趣参考 Github 的markdown内容[https://...
    tangyefei阅读 35,215评论 22 257
  • 模块间联系越多,其耦合性越强,同时表明其独立性越差( 降低耦合性,可以提高其独立性)。软件设计中通常用耦合度和内聚...
    riverstation阅读 2,089评论 0 8
  • 一、Django简介 Django是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网...
    仙灵儿阅读 3,477评论 0 5