首先建立Student,Dpartment,Course,Stu_info表
#学院表
class Department(models.Model):
d_id = models.AutoField(primary_key=True)
d_name = models.CharField(max_length=30)
def __str__(self):
return '[id={},name={}]'.format(self.d_id,self.d_name)
#学生表
class Student(models.Model):
s_id = models.AutoField(primary_key=True)
s_name = models.CharField(max_length=30)
department = models.ForeignKey('Department',on_delete=models.CASCADE)
def __str__(self):
return '[id={},name={}],department={}]'.format(self.s_id,self.s_name,self.department)
#学生详情表
class Stu_detail(models.Model):
student = models.OneToOneField('Student',on_delete=models.CASCADE)
age = models.IntegerField()
address = models.CharField(max_length=50,null=True)
greder = models.BooleanField(default=True)
note = models.TextField()
def __str__(self):
return '[student={},age={},address={},greder={},note={}]'.format(self.student,
self.age,
self.address,
self.greder,
self.note)
#课程表
class Course(models.Model):
c_id = models.AutoField(primary_key=True)
c_name = models.CharField(max_length=20)
student = models.ManyToManyField('Student')
def __str__(self):
return '[id={},name={}],student={}'.format(self.c_id,self.c_name,self.student)
一对多表关系数据的添加:
1.第一种方式就是跟之前的一样,用传参的方法添加,需要注意的是外键的值必须是关联表中已经存在的值.
2.第二种方式是用的属性赋值的方式,因为我们在模型类有定义了一个department的属性,而这个属性的对象的类型必须是department表的类实例对象
表关联对象的访问:
Student的模型类中我们有定义department的属性,所以当我们去访问的时候,可以直接通过student.department的形式去找到某个学生的所属学院是哪个.
那么如果我们也希望在在访问某个学院的实现对象的学生的时候改怎么访问呢???
表关联对象的访问:
如果模型I有一个ForeignKey,那么该ForeignKey 所指的模型II实例可以通过一个管理器回前面有ForeignKey的模型I的所有实例。默认情况下,这个管理器的名字为foo_set,其中foo 是源模型的小写名称。
表关联对象的访问:
表关联对象的访问:
可以在定义时设置related_name 参数来覆盖foo_set 的名称.
处理关联对象的一些方法:
add(obj1, obj2, ...) 添加的已经存在数据库的数据,添加一指定的模型对象到关联的对象集中。
1.d1.student的管理器有add的方法.
2.例子中的s2能添加成功是因为设置了student表中department字段允许为空了.
create(**kwargs) 添加不存在的数据 ,将数据直接存入数据库
创建一个新的对象,将它保存并放在关联的对象集返回新创建的对象。
这里通过管理器就能使用create的方法去添加数据
d1.student,s1.course,c1student_set这三个返回的是管理器
remove(obj1, obj2, ...)
从关联的对象集中删除指定的模型对象。删除的是关系表中的数据
因为我们有修改student表中的department_id字段允许为空,所以当删除的时候这个字段值为NULL.
clear() 从关联的对象集中删除所有的对象
注意对于所有类型的关联字段,add()、create()、remove()和clear()都会马上更新数据库。换句话说,在关联的任何一端,都不需要再调用save()方法。
多表查询----跨关联关系的查询:
Django 提供一种强大而又直观的方式来“处理”查询中的关联关系,它在后台自动帮你处理JOIN。 若要跨越关联关系,只需使用关联的模型字段的名称,并使用双下划线分隔,直至你想要的字段:
# 查询学院名字为‘计算机学院’的学生的信息
Student.objects.filter(department__d_name='计算机学院')
它还可以反向工作。若要引用一个“反向”的关系,只需要使用该模型的小写的名称。
#查询学生名字中包含 '小' 的学生的学院信息
Department.objects.filter(student__s_name__contains='小')
# 查询学号为1的学生所有的课程
Course.objects.filter(student__s_id=1)
# 查询报了课程1的所有的学生
Student.objects.filter(course__c_id=1)
# 查询报了'python'课程的的学生的所属学院的信息
Department.objects.filter(student__course__c_name='python')
网友评论