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

这篇具有很好参考价值的文章主要介绍了[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 ->什么也不做
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"]

一对一 查询

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

一对多 查询

**************************************** 一,找到 “多” ************************************************

grade = Grade.objects.get(id=3)
for student in grade.student_set.all():
    print(student.name)

*************************************** 多,找到"" ************************************************文章来源地址https://www.toymoban.com/news/detail-758219.html

s = Student.objects.()
# 这种写法(s.grade)会查一次数据库
	print(s.grade.grade_name)
	
下面是优化的写法:
s = Student.objects.select_related("grade").all() #这种写法会用inner join
	print(s.grade.grade_name)
意思是,将id=3的student拿到,同事将grade用 innor join同步查出来

到了这里,关于[Django-04]一对一,一对多的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • hibernate 一对一 一对多 多对多

    User 实体类 Address 实体类 测试 User实体类 Vlog实体类 测试 测试 mappedby : 属性指向实体关联表的拥有者,声明在被拥有者。 简单说就是另一边定义了关联规则,这边不用再定义一遍了,直接引用就行。 @JoinColumn : 外键列 在一对一中 @JoinColumn 声明在那个实体类中,生成数据库表

    2024年02月13日
    浏览(50)
  • queryWrapper处理一对一,一对多,多对多

    是的,定义一个 BankUser 对象时,通常需要在其内部定义一个 BankCard 字段来表示其与 bank_card 表的关联关系。 例如,在 BankUser 类中定义一个 BankCard 对象作为其属性:```java ``` 然后,在查询 BankUser 对象时,需要使用 LEFT JOIN 将 bank_user 和 bank_card 表进行关联,并使用 select 方法指

    2024年02月04日
    浏览(49)
  • [MySql]实现多表查询-一对一,一对多

    目录 多表关联关系的分类 mybatis中的多表查询: 数据库准备  项目目录  一对一查询(多对一) 方式一:(xml文件映射) 查询结果:  方式二:(注解映射)  一对多查询(一对多) 方式一:(xml文件映射)  方式二:(注解映射) 既然数据库是存储项目中的数据的,项目中的

    2023年04月10日
    浏览(56)
  • TCP一对一聊天

    客户端 服务端  结果展示  第二种 客户端 服务端 结果

    2024年02月04日
    浏览(46)
  • MyBatis关联查询实战:一对一与一对多详细解析

    MyBatis是一款强大的持久层框架,提供了多种方式来处理关联查询,其中包括一对一和一对多的情况。在本文中,我们将深入探讨这两种关联查询的实现方式,并通过具体的示例代码进行详细解释。 实现一对一关联查询的方式有多种,其中包括嵌套查询(Nested Queries)和结果集

    2024年01月19日
    浏览(73)
  • MyBatis案例三:商品的类别(一对一,一对多查询)

    在数据库分别创建一个product、category表: 商品表(product) 商品编号(id) 商品名称(goodsname) 商品单价(price) 商品类别(typeid) 1 电视机 5000 1 2 冰箱 4000 2 3 空调 3000 2 4 洗衣机 2000 2 商品类别表(category) 商品类别编号(id) 商品类别名称(typename) 1 黑色家电 2 白色家电

    2023年04月08日
    浏览(53)
  • STM32 LWIP UDP 一对一 一对多发送

    之前没有接触过网络的通信,工作需要 UDP 接收和发送通信,在网上没有找到一对一、一对多的相关例程;于是在技术总监对我的指导,用正点原子板子给的例程是从官方的程序修改的,实现了Lwip UDP通信一对一、一对多的发送程序,可以随便指定发送 ip地址 、发送 端口号

    2024年02月15日
    浏览(52)
  • OVS Vxlan一对一模式VS一对多模式

    OVS Vxlan模式 OVS 支持 GRE、VXLAN、STT、Geneve和IPsec隧道协议,这些隧道协议就是overlay网络的基础协议,通过对物理网络做的一层封装和扩展,解决了二层网络数量不足的问题,最大限度的减少对底层物理网络拓扑的依赖性,同时也最大限度的增加了对网络的控制。针对VXLAN隧道创

    2024年02月03日
    浏览(58)
  • TCP实现一对一聊天

    一,创建类 二,类 1.ChatSocketServer类 2.ChatSocketClient类 三,结果(先服务  再客户)

    2024年02月03日
    浏览(48)
  • Mybatis:一对一查询映射处理

    本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远! MyBatis是一种流行的Java持久化框架,它提供了灵活而强大的查询映射功能。在一些复杂的数据模型中

    2024年02月14日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包