(十)Django ORM一对多关系数据模型CRUD操作

博客围绕学科与学员的一对多关系展开,先进行模型搭建并同步数据库、添加数据。接着详细介绍了CRUD操作,查询有正向和反向共3种方式,添加有save、create等3种方式,还提及删除操作,修改也有save、update等3种方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模型搭建:

学科与学员:一对多关系
# 学科与学生:一对多关系
# 学科模型类
class Subject(models.Model):
    id = models.AutoField(primary_key=True)  # id主键
    name = models.CharField(max_length=24)  # 学科名称
    price = models.IntegerField()  # 学费
    def __str__(self):
        return "<Sub_obj:{}>".format(self.name)  # 打印对象

# 学生模型类
class Student(models.Model):
    id = models.AutoField(primary_key=True)  # id主键
    name = models.CharField(max_length=24)  # 学员名字
    # 外键字段,创建数据库会生成subject_id外键字段 ,subject也作为一个Subject实例化的对象
    subject = models.ForeignKey(to='Subject',on_delete=models.CASCADE)
    def __str__(self):
        return "<Stu_obj:{}>".format(self.name)

同步数据库:
在这里插入图片描述
添加数据:
学科表(subject)
在这里插入图片描述
学员表(student)
在这里插入图片描述

一、查询操作R(3种方式)

正向查询(以多表为主)
1、通过对象方式

# 查询操作
def search(request):
    # 正向查询 从学生表查找 查询张三的学科(两种方式)
    # 获取张三的学生模型类对象
    student_obj = models.Student.objects.get(name='张三')
    # 通过学生模型类中subject对象获取学科类对象
    subject_obj = student_obj.subject
    print(subject_obj)
    print(subject_obj.name)
    return HttpResponse("是你呀!")

在这里插入图片描述
2、通过外键id值获取学科信息

def search(request):
	student_obj = models.Student.objects.get(name='张三')
    subject_obj = models.Subject.objects.get(id=student_obj.subject_id)
    print(subject_obj)
    return HttpResponse("是你呀!")

在这里插入图片描述
3、反向查询(以一表为主,Django默认提供了一表与多表的关联字段)

def search(request):
	#反向查询 从学科表查找 查询所有学科的学生
    subject_obj = models.Subject.objects.get(id=1)
    # 类名小写_set 属性进行关联
    result = subject_obj.student_set.all()
    print(result)
    return HttpResponse("是你呀!")

二、添加操作C(3种方式)

新增学员赵六,python学科
1、save()方法添加

def add(request):
    # 新增学员,python学科 save()
    sub_obj = models.Subject.objects.get(name='python')
    # 实例化一个新的学员对象
    stu_obj = models.Student()
    stu_obj.name = "赵六" # 赋值name
    # stu_obj.subject = sub_obj # 赋值对象
    stu_obj.subject_id = sub_obj.id # 赋值id
    stu_obj.save()
    return HttpResponse("添加成功")

在这里插入图片描述
2、create()方法添加

def add(request):
	#create() # 方式添加
    sub_obj = models.Subject.objects.get(name='python')
    stu_obj = models.Student.objects.create(
        name="赵六",
        subject=sub_obj
    )
    print(stu_obj)
    return HttpResponse("添加成功")

3、反向添加,基于学科表

def add(request):
	    sub_obj = models.Subject.objects.get(name='python')
    sub_obj.student_set.create(
        name="赵六"
    )
    return HttpResponse("添加成功")

三、删除操作D

# 删除操作
def delete(request):
    # 删除单条记录
    models.Student.objects.get(name='赵六').delete()
    # 同时删除多条记录
    models.Student.objects.filter(name__contains='四').delete()
    return HttpResponse("删除成功")

四、修改操作U(3种方式)

王五转学java
1、save()方法

# 修改操作
def update(request):
    # 使用save()王五转学java
    # 获取java的学科表模型对象
    sub_obj = models.Subject.objects.get(name='java')
    # 获取王五的学员表模型对象
    stu_obj = models.Student.objects.get(name='王五')
    # 对象赋值
    stu_obj.subject = sub_obj
    # 保存操作
    stu_obj.save()
    return HttpResponse("修改成功")

在这里插入图片描述
2、update()方法

def update(request):
	sub_obj = models.Subject.objects.get(name='java')
    # 这里使用filter是由于filter返回的是QuerySet对象,可以使用update方法,而get不可以
    stu_obj = models.Student.objects.filter(name="王五").update(
        subject = sub_obj
    )
    return HttpResponse("修改成功")

3、反向修改

def update(request):
	    # 反向修改
    sub_obj = models.Subject.objects.get(name='python')
    stu_obj = models.Student.objects.get(name="王五")
    stu_obj2 = models.Student.objects.get(name="赵柳")
    # 这里的set方法不会提示,而且得传递列表,列表中存放学员对象
    sub_obj.student_set.set([stu_obj,stu_obj2])

    return HttpResponse("修改成功")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值