美文网首页
day04 -关系的一对一 一对多 多对多

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

作者: 李小萌mmm | 来源:发表于2018-11-28 20:02 被阅读0次

    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('添加和删除学生之间的关联关系')
    

    相关文章

      网友评论

          本文标题:day04 -关系的一对一 一对多 多对多

          本文链接:https://www.haomeiwen.com/subject/qhnzqqtx.html