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

相关文章

  • Models and Databases 11.例子

    关系 多对多 关系 多对一 关系 一对一

  • 数据库一对一、一对多、多对多设计

    数据库一对一、一对多、多对多设计 数据库实体间有三种对应关系:一对一、一对多、多对多 一对一关系示例: 一个学生对...

  • Django 模型间的关系

    Django模型之间的关系 Django模型的对应关系,一对一,一对多,以及多对多的关系。 一对一 OneToOn...

  • day3-django模型对应关系

    模型的对应关系,一对一,一对多,以及多对多的关系。 模型对应关系描述如下:1:1 一对一 OneToOneFi...

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

    Tips:ForeignKey 定义在多的一方 OneToOneField 和 ManyToManyField ...

  • 模型关联关系

    模型的对应关系主要分为:一对一,一对多,以及多对多。 模型对应关系描述如下:1:1 一对一 OneToOneFie...

  • spring-data-jpa

    Spring Data JPA 之 一对一,一对多,多对多 关系映射

  • 2018-12-20 模型关系和钩子函数

    一、模型关系定义 1.1 一对多   一对多关系中的查询操作 1.2 一对一 1.3 多对多   创建多对多关系 ...

  • 八:关联关系

    表的关系:MySQL相互关联的表之间存在一对一,一对多(多对一),多对多的关系 1.一对一的关系:表1中的一条数据...

  • SQLAlchemy

    SQLAlchemy_建表(一对一/一对多/多对多)关系 Basic Relationship Patterns ...

网友评论

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

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