多对一关系

本文详细介绍了Django框架中多对一关系的定义、增删改查操作,以及正向和反向查询方法。通过示例展示了如何在教师和学生模型之间建立多对一关系,并进行数据操作。同时,解释了如何通过外键进行关联查询,以及如何利用内置属性进行反向查询。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

一、多对一关系

1.多对一关系是什么

Django使用django.db.models.ForeignKey定义多对一关系。
ForeignKey需要一个位置参数:与该模型关联的类
代码如下(示例):

class Info(models.Model):
      user = models.ForeignKey(other_model,on_delete=models.SET_NULL)

生活中的多对一关系:班主任,班级关系。一个班主任可以带很多班级,但是每个班级只能有一个班主任

from django.db import models
# id  name  gender  定义老师的模型类
class Teacher(models.Model):
    name = models.CharField(max_length=30,verbose_name="老师姓名")
    gender = models.CharField(max_length=10,verbose_name="老师性别")
    class Meta:
        db_table = "teachers"
    def __str__(self):
        return self.name
# id name gender score teacher_id
class Student(models.Model):
    name = models.CharField(max_length=20,verbose_name="学生姓名")
    gender = models.CharField(max_length=10,verbose_name="学生性别")
    score = models.IntegerField(verbose_name="学生分数")
    # to:后边写所关联的模型类  
    # on_delete=models.CASCADE:主表中数据删除,从表也删除
    # 外键关联的是整个模型类,不是单独的某一个对象
    # 但是通过模型类会产生一个相关联的字段  字段名_id
    teacher = models.ForeignKey(to=Teacher,on_delete=models.CASCADE,verbose_name="所属老师")
    class Meta:
        db_table = "students"
    def __str__(self):
        return self.name

2.多对一关系的增删改操作

代码如下(示例):

添加老师语法:
	模型类.objects.create()
    Teacher.objects.create(name="王老师",gender="女")
删除老师语法:
	模型类.objects.get(条件).delete()
	# 删除id为2的老师
	Teacher.objects.get(id=2).delete()  # (3, {'myapp.Student': 2, 'myapp.Teacher': 1})									# 3代表一共删除的数据个数  Student删除3条 Teacher删除1
修改老师语法:
    模型类.objects.filter(条件).update()
	# 修改id为3的老师性别为女
	Teacher.objects.filter(id=3).update(gender="女")

以上创建了两条老师数据
由于我们设置外键关联可以为空null=True,所以此时在班级表创建时,可以直接保存,不需要提供老师数据
该处使用的url网络请求的数据。

添加学生语法:
    模型类.objects.create()
	通过外键_id的形式来添加
 		Student.objects.create(name="李四",gender="男",score=80,teacher_id=3)
	直接给外键赋值一个老师对象
		t1 = Teacher.objects.create(name="李老师",gender="男")
		Student.objects.create(name="李四",gender="男",score=80,teacher=t1)
删除学生语法:
	模型类.objects.get(条件).delete()
    Student.objects.get(id=1).delete()
修改学生语法:
    模型类.objects.filter(条件).update(字段1,字段2...)
    Student.objects.get(id=1).update(name="张三")

3. 多对一的正向查询

将老师分配个班级之后,由于班级表关联了老师字段,我们可以通过班级找到对应老师
虽然老师表中没有关联班级字段,但是也可以通过老师找到他所带的班级,这种查询方式也叫作关联查询
代码如下(示例):

# 查询id为2的学生的老师姓名
	--找到id为2的学生
    stu = Student.objects.get(id=2)
    --找到stu对应的老师    stu.teacher.name
    stu.外键.name

4.多对一的反向查询

通过模型类名称后追加一个_set,来实现反向查询
代码如下(示例):

反向查询:通过django的内置属性来进行查询  模型类(模型类小写)_set()可以反向查询老师名下的所有学生,
    # 查询id为1的老师的所有学生    --先找到id为1的老师    
    tea = Teacher.objects.get(id=1)    
    --查询tea老师名下的所有学生  老师对象.模型类_set.all()    
    tea.student_set.all()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值