django中的几个表关系的查询

本文详细介绍了Django中一对一和一对多关系的查询操作,包括OneToOneField和ForeignKey的正向与反向查询方法,以及查询示例。涉及字段定义、查询语法以及查询集的使用。
摘要由CSDN通过智能技术生成

一对一、一对多、多对多的区分:

一对一:子表从母表中选出一条数据一一对应,母表中选出来一条就少一条,子表不可以再选择母表中已被选择的那条数据

一对多:子表从母表中选出一条数据一一对应,但母表的这条数据还可以被其他子表数据选择

多对多总结:比如有多个孩子,和多种颜色、每个孩子可以喜欢多种颜色,一种颜色可以被多个孩子喜欢,对于双向均是可以有多个选择。

含有关系字段的表称为子表,被关联的表称之为母表。

OneToOneField:

一对一关系,可将关系字段定义在任意一方。

正向查询即从字表查询母表,由两种格式为:

class person(models.Model):
    isMarryed = models.BooleanField(default=True,verbose_name='婚否')
    education = models.CharField(max_length=10,verbose_name='学历')

class idCard
Django 进行多查询有多种方法,以下是其几种常见的方法: 1. 使用 related_name 属性:在定义 ForeignKey 或 OneToOneField 字段时,可以通过 related_name 属性指定反向关系的名称,然后在查询时可以通过该名称进行反向查询。 例如,假设有两个模型 A 和 B,其 B 模型有一个 ForeignKey 字段关联到 A 模型: ```python class A(models.Model): name = models.CharField(max_length=100) class B(models.Model): a = models.ForeignKey(A, on_delete=models.CASCADE, related_name='bs') content = models.TextField() ``` 则可以通过以下方式查询 A 对象及其关联的 B 对象: ```python a = A.objects.get(id=1) bs = a.bs.all() ``` 2. 使用 select_related 方法:当查询一个模型对象时,如果该模型对象关联了其他模型对象,可以使用 select_related 方法一次性将关联的对象一起查询出来,避免了多次查询数据库的问题。 例如,假设有两个模型 A 和 B,其 B 模型有一个 ForeignKey 字段关联到 A 模型: ```python class A(models.Model): name = models.CharField(max_length=100) class B(models.Model): a = models.ForeignKey(A, on_delete=models.CASCADE) content = models.TextField() ``` 则可以通过以下方式查询 B 对象及其关联的 A 对象: ```python b = B.objects.select_related('a').get(id=1) a = b.a ``` 3. 使用 prefetch_related 方法:当查询一组模型对象时,如果这些模型对象关联了其他模型对象,可以使用 prefetch_related 方法一次性将所有关联的对象一起查询出来,避免了多次查询数据库的问题。 例如,假设有两个模型 A 和 B,其 A 模型有一个反向 ForeignKey 字段关联到 B 模型: ```python class A(models.Model): name = models.CharField(max_length=100) bs = models.ForeignKey(B, on_delete=models.CASCADE, related_name='as') class B(models.Model): content = models.TextField() ``` 则可以通过以下方式查询 B 对象及其关联的 A 对象: ```python bs = B.objects.prefetch_related('as').all() for b in bs: as = b.as.all() ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值