lxinghua

博客园 首页 新随笔 联系 订阅 管理

一、关系表的数据操作

1. 关系表的数据操作,查看数据库中的表结构

2. 一对多关系数据的添加

① 第一中方式就是跟之前一样,用传参的方式添加,需要注意的是外键的值必须是关联表中已经存在的值

② 第二种方式是用的属性赋值的方式,因为我们在模型类有定义了一个department的属性,而这个属性的对象的类型必须是department表的类实例对象

二、 表关联对象的访问

表关联对象的访问

Student的模型类中我们有定义department的属性,所以当我们去访问的时候,可以直接通过student.department的形式去找到某个学生的所属学院是哪个。

处理关联对象的一些方法

add(obj1, obj2, ... )添加的已经存在数据库的数据,添加——指定的模型对象到关联的对象集中。

create(**kwargs) 添加不存在的数据,将数据直接存入数据库

创建一个新的对象,将它保存并放在关联的对象集返回新创建的对象

remove(obj1, obj2, ... ) 

从关联的对象集中删除指定的模型对象。删除的是关系表中的数据。

dear() 从关联的对象集中删除所有的对象

注:对于所有类型的关联字段,add()、create()、remove()、clear()都会马上更新数据库。换句话说,在关联的任何一端,都不需要再调用save()方法。

三、 多表查询

案例:仅提供app中models.py以及views.py代码,其他代码参考前期内容!

models.py

from django.db import models


# 学院表
class Department(models.Model):
    d_id = models.AutoField(primary_key=True)
    d_name = models.CharField(max_length=20, unique=True)

    def __str__(self):
        return f'd_id={self.d_id}, d_name={self.d_name}'


# 学生表
class Students(models.Model):
    s_id = models.AutoField(primary_key=True)
    s_name = models.CharField(max_length=20)
    # d_id为外键且不唯一,需要建立与Department表的一对多关系
    d_id = models.ForeignKey('Department', on_delete=models.SET_NULL, null=True)
    # models.SET_NULL 表示在所关联的表对应的信息被删除后,此处信息可以变更为null

    def __str__(self):
        return f's_id={self.s_id}, s_name={self.s_name}'


# 学生详情表
class Stu_detail(models.Model):
    sd_id = models.AutoField(primary_key=True)
    sd_sex = models.BooleanField(default=1)
    sd_age = models.IntegerField()
    intro = models.TextField(null=True)    # 学生介绍信息,可为空
    # s_id为外键且唯一,需要建立与Students表的一对一关系
    s_id = models.OneToOneField('Students', on_delete=models.CASCADE, unique=1)

    def __str__(self):
        return f'sd_id={self.sd_id}, sd_sex={self.sd_sex}, sd_age={self.sd_age}'


# 课程详情表
class Course(models.Model):
    c_id = models.AutoField(primary_key=True)
    c_name = models.CharField(max_length=20, unique=True)
    # c_id为外键且唯一,在与Students表存在多对多关系
    s_id = models.ManyToManyField('Students')

    def __str__(self):
        return f'c_id={self.c_id}, c_name={self.c_name}'

views.py

from django.shortcuts import render
from django.http import HttpResponse
from .models import Department, Students, Stu_detail, Course


def add(request):
    # # 学院表添加
    # Department.objects.get_or_create(d_name="理学院")
    # Department.objects.get_or_create(d_name="计算机学院")
    # Department.objects.get_or_create(d_name="医学院")
    # Department.objects.get_or_create(d_name="法学院")
    #
    # # 学生表
    # Students.objects.get_or_create(s_name='zl', d_id_id=1)   #此处关联d_id需要确认数据库中对应的具体id的格式
    # Students.objects.get_or_create(s_name='bd', d_id_id=1)
    # Students.objects.get_or_create(s_name='dd', d_id_id=3)
    # Students.objects.get_or_create(s_name='yh', d_id_id=2)
    #
    # # 学生详情表
    # Stu_detail.objects.get_or_create(sd_sex=1, sd_age=18, s_id_id=1)
    # Stu_detail.objects.get_or_create(sd_sex=1, sd_age=19, s_id_id=2)
    # Stu_detail.objects.get_or_create(sd_sex=0, sd_age=18, s_id_id=3)
    # Stu_detail.objects.get_or_create(sd_sex=0, sd_age=23, s_id_id=4)
    #
    # # 课程表
    # Course.objects.get_or_create(c_name='python')
    # Course.objects.get_or_create(c_name='java')
    # Course.objects.get_or_create(c_name='c++')
    # Course.objects.get_or_create(c_name='mysql')

    # # 选课表,学生与课程表关联表
    # # 首先获取信息
    # c1 = Course.objects.get(c_id=1)   # 课程信息
    # c2 = Course.objects.get(c_id=2)
    # c3 = Course.objects.get(c_id=3)
    # c4 = Course.objects.get(c_id=4)
    #
    # s1 = Students.objects.get(s_id=1)   # 学生信息
    # s2 = Students.objects.get(s_id=2)
    # s3 = Students.objects.get(s_id=3)
    # s4 = Students.objects.get(s_id=4)
    #
    # # 正向与方向访问
    # # 给学生分配课程  是反向访问  课程表的名字(小写)_set.add(xx,yy)添加
    # s1.course_set.add(c1, c4)
    # s2.course_set.add(c2)
    # s4.course_set.add(c2)
    # # 如果是给课程分配学生的话,则为正向访问,采用课表名.关联名.add(xx,yy)添加
    # c2.s_id.add(s2, s4)
    # c1.s_id.add(s1)
    # c4.s_id.add(s1)

    return HttpResponse("数据添加成功!")


def query(request):
    # 学院表
    d1 = Department.objects.get(d_id=1)
    d2 = Department.objects.get(d_id=2)
    d3 = Department.objects.get(d_id=3)
    d4 = Department.objects.get(d_id=4)

    # 学生表
    s1 = Students.objects.get(s_id=1)
    s2 = Students.objects.get(s_id=2)
    s3 = Students.objects.get(s_id=3)
    s4 = Students.objects.get(s_id=4)

    # 学生详情表
    sd1 = Stu_detail.objects.get(sd_id=1)
    sd2 = Stu_detail.objects.get(sd_id=2)
    sd3 = Stu_detail.objects.get(sd_id=3)
    sd4 = Stu_detail.objects.get(sd_id=4)

    # 课程表
    c1 = Course.objects.get(c_id=1)
    c2 = Course.objects.get(c_id=2)
    c3 = Course.objects.get(c_id=3)
    c4 = Course.objects.get(c_id=4)

    # 学院表与学生表  一对多关系查询
    # 正向访问 由学生表信息获取zl所在的学院信息
    zl_d = s1.d_id.d_name
    print(zl_d)
    # 反向访问 由学院信息获取d1学院所有的学生信息
    d1_s = d1.students_set.all()
    print(d1_s)

    # 学生表与学生详情表  一对一关系查询
    sd1_s = sd1.s_id.s_name    # 正向查询,由学生详情表查询对应学生表信息
    print(sd1_s)
    zl_sd = s1.stu_detail.intro   # 反向查询  由学生信息查询对应学生详情表信息,此处因为为一对一关系表,过stu_detail后不需要添加_set
    print(zl_sd)

    # 学生表与课程表  多对多关系查询
    print(s1.course_set.all())   # 反向查询
    print(c2.s_id.all())   # 正向访问

    return HttpResponse("OK!")


def remove(request):
    # 学院表
    d1 = Department.objects.get(d_id=1)
    d2 = Department.objects.get(d_id=2)
    d3 = Department.objects.get(d_id=3)
    d4 = Department.objects.get(d_id=4)

    # 学生表
    s1 = Students.objects.get(s_id=1)
    s2 = Students.objects.get(s_id=2)
    s3 = Students.objects.get(s_id=3)
    s4 = Students.objects.get(s_id=4)

    # 学生详情表
    sd1 = Stu_detail.objects.get(sd_id=1)
    sd2 = Stu_detail.objects.get(sd_id=2)
    sd3 = Stu_detail.objects.get(sd_id=3)
    sd4 = Stu_detail.objects.get(sd_id=4)

    # 课程表
    c1 = Course.objects.get(c_id=1)
    c2 = Course.objects.get(c_id=2)
    c3 = Course.objects.get(c_id=3)
    c4 = Course.objects.get(c_id=4)

    s1.course_set.remove(c1)   # 反向访问,通过学生表s1删除课程表c1课程,仅删除课程不删除学生信息
    s1.course_set.clear()  # 反向访问,通过学生表s1删除其所有课程,仅删除课程不删除学生信息

    c2.s_id.clear()  # 正向  通过c2课程信息删除所有学习了c2课程的学生信息,仅删除课程不删除学生信息

    return HttpResponse("删除成功!")


def update(request):
    # 学院表
    d1 = Department.objects.get(d_id=1)
    d2 = Department.objects.get(d_id=2)
    d3 = Department.objects.get(d_id=3)
    d4 = Department.objects.get(d_id=4)

    # 学生表
    s1 = Students.objects.get(s_id=1)
    s2 = Students.objects.get(s_id=2)
    s3 = Students.objects.get(s_id=3)
    s4 = Students.objects.get(s_id=4)

    # 学生详情表
    sd1 = Stu_detail.objects.get(sd_id=1)
    sd2 = Stu_detail.objects.get(sd_id=2)
    sd3 = Stu_detail.objects.get(sd_id=3)
    sd4 = Stu_detail.objects.get(sd_id=4)

    # 课程表
    c1 = Course.objects.get(c_id=1)
    c2 = Course.objects.get(c_id=2)
    c3 = Course.objects.get(c_id=3)
    c4 = Course.objects.get(c_id=4)

    d2.students_set.add(s1)   # 反向修改  将s1学生修改为d2学院

    return HttpResponse("修改成功!")


def find(request):
    # 查询计算机学院的学生信息
    Students.objects.filter(d_id__d_name='计算机学院')  # 通过关联d_id以"__"拼接d_name查询对应学院的学信信息

    # 查询zl所在的学院信息
    Department.objects.filter(students__s_name='zl')   # 学院表反向访问学生表

    # 查询理学院并且报名了web课程的学生信息
    Students.objects.filter(d_id__d_name="理学院", course__c_name='web')   # 先正向再方向查询

    # 查询理学院并且报名了web课程的学生详情信息
    Stu_detail.objects.filter(s_id__d_id__d_name='理学院', s_id__course__c_name='web')
posted on 2023-05-22 11:10  興華  阅读(23)  评论(0编辑  收藏  举报