[Django-04]一对一,一对多

关系互相查询

    • 参数
    • [一对一 查询](#一对一 查询)
    • [一对多 查询](#一对多 查询)

参数

OneToOneField(),ForeignKey() 的参数如下

  1. to 要连接的模型
  2. to_field 要被关联的目标Model的字段
  3. on_delete 删除主表(被关联的表,也就是非OneToOneField,ForeignKey的表)时,当前表怎么处理。
    CASCADE->联动删除
    PROTECT ->抛出异常
    SET_NULL->设为null
    SET_DEFAULT->设为预定义的默认值
    SET->设置为指定的值
    DO_NOTHIND ->什么也不做
java 复制代码
class Grade(models.Model):
    id = models.AutoField(verbose_name='自增id', name="id", primary_key=True)
    grade_name = models.CharField(verbose_name="班级名称", name="grade_name", max_length=200)
    # grade_name = models.CharField(verbose_name="班级名称", db_column="grade_name", max_length=200)
    create_time = models.DateTimeField(verbose_name='创建时间',name="create_time", auto_now_add=True)  # 第一次赋值
    update_time = models.DateTimeField(verbose_name='最后一次更新时间',name="update_time", auto_now=True)  # 第二次赋值
    class Meta:
        db_table = "app_grade"
        ordering=["-update_time","create_time"]


class GradeManager(models.Model):
	"""
	一对一
	"""
    id = models.AutoField(verbose_name='自增id', name="id", primary_key=True)
    manager_name = models.CharField(verbose_name="班主任名称", db_column="manager_name", max_length=200,default=None)
    create_time = models.DateTimeField(verbose_name='创建时间',db_column="create_time", auto_now_add=True)  # 第一次赋值
    update_time = models.DateTimeField(verbose_name='最后一次更新时间',db_column="update_time", auto_now=True)  # 第二次赋值
    # 下面会在数据库中生成grade_id字段
    grade=models.OneToOneField(verbose_name='班主任表', to=Grade,on_delete=models.CASCADE)
    class Meta:
        db_table = "app_grade_manager"
        ordering=["-update_time","create_time"]

class Student(models.Model):
    """
    一对多
    to: 关联的父 类
    to_filed:
    外键要放在 多表中
    删除父表数据时,当前表与关联表的filed的行为。
    ForeignKey->字段名称会自动拼接id, 因此对应的序列化对象要加上id
    """
    id = models.AutoField(verbose_name='自增id', name="id", primary_key=True)
    name = models.CharField(verbose_name='名字', name='name', max_length=200)
    address = models.JSONField(verbose_name="地址信息", name="address")
    create_time = models.DateTimeField(verbose_name='创建时间', name='create_time', auto_now_add=True)  # 第一次赋值
    update_time = models.DateTimeField(verbose_name='最后一次更新时间', name='update_time', auto_now=True)  # 第二次赋值
    # 下面会在数据库生成grade_id字段
    grade = models.ForeignKey(verbose_name="关联外键", name="grade", to=Grade, on_delete=models.CASCADE)

    class Meta:
        db_table = "app_student"
        ordering=["-update_time","create_time"]

一对一 查询

python 复制代码
grade = Grade.objects.get(id=3)
print(grade.grademanager.manager_name) # 反向通过model小写名称引用
gradeManager = GradeManager.objects.get(id=1)
print(gradeManager.grade.grade_name) # 正向直接通过属性grade引用

一对多 查询

**************************************** 从查主,找到 "一" ************************************************

python 复制代码
grade = Grade.objects.get(id=3)
print(s.grade_id,s.grade.grade_name,s.grade.id)

*************************************** 主查从,找到"多" ************************************************

python 复制代码
 grade = Grade.objects.get(id=2)
 for student in grade.student_set.all():
	print(student.name)
相关推荐
badhope10 分钟前
Spring AI Alibaba停更:Java程序员的信任,还能被辜负几次?
java·spring
snhna16 分钟前
DeerFlow 2.x 源码拆解:多智能体委派、Skills、沙箱与 Linux 部署实战
人工智能·python
const_qiu17 分钟前
第一章 1.1-1.2:基础模型调用与 TypeScript 入门 —— Java 开发者的视角
java·javascript·typescript
Wang's Blog22 分钟前
Java 项目实战: 交友项目 - Dubbo 负载均衡策略与实战验证
java·dubbo·交友
Wx-bishekaifayuan24 分钟前
springboot桂味美食分享系统40540-计算机课程设计、毕业设计
spring boot·后端·python·django·课程设计·express·旅游
SL_staff27 分钟前
销售知识库7天落地实践:面向业务侧的零代码嵌入方案
java·开源·产品
GreatSQL社区36 分钟前
主从复制SQL线程中断——字符集砸出的坑
java·数据库·算法
Metaphor69238 分钟前
如何快速拆分超大 Excel 文件【Python 教程】
python·excel
Wang's Blog1 小时前
Java 项目实战: 交友项目 - 入门案例:服务提供者搭建总结
java·交友
hudd6681 小时前
JavaEE 初阶 - 多线程(进阶)
java·开发语言·java-ee