django orm一对多

本文详细介绍了Django框架中ORM一对多关系的实现方式,包括如何在models.py中定义一对多关系,以及如何在查询时利用外键字段进行关联表数据的获取。文章还解释了Django自动生成的_id字段的作用,以及在更新操作中如何正确处理关联对象。

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

在django中,django为我们提供了方便快捷的orm,这篇文章只对orm中的一对多进行简单介绍。在django中我们在对应app中的model文件中创建自己的数据表。如下

class NBA_team(models.Model):
    team_id=models.AutoField(primary_key=True)
    name=models.CharField(max_length=32,unique=True)
class nba_player(models.Model):
    pid=models.AutoField(primary_key=True)
    name=models.CharField(max_length=32)
    play_team=models.ForeignKey('NBA_team',to_field='team_id',on_delete=models.CASCADE)
    number=models.IntegerField()
    score=models.IntegerField()

这里类名为相对应的表名,类里面的为数据表中对应的字段名,在表nba_player中,字段play_team通过外键关联表NBA_team.在查询时,可以在nba_player表中通过play_team字段来查询表NBA_team中对应的数据。
在Django中,对于表nba_player来说django为我们自动存储了nba_player_id字段,这个字段对应的就是表NBA_team中的team_id.而本身表nba_player表中play_tean这对应的是一个对象,这个对象为class NBA_team的对象。在查找的时候我们可以通过nba_player.player_team.xx,通过.来取值,也可以通过双下划线来取值即nba_player.player_team__xx来查找,但是在更新时,即updata时 表nba_player字段要么以对象的方式来更新,要么以nba_player_id对应id的方式来更新,不可以用双下划线更新。这里多说一句,nba_player_id这个对应的_id是和定义外键时关联字段有关,不一定都是对应关联表的主键。
当然在关联表中使用xxoo_set()反向查找,xxoo为表名。例如这里的NBA_team_set().

### Django ORM 关系的用法 在Django中,定义一个的关系非常简单。只需要在一个模型类里使用`ManyToManyField`来声明这种关联即可[^1]。 #### 定义关系 假设有一个应用涉及书籍和作者两个实体之间的联系——一本书可以有个作者,而一位作者也可以写过本书籍: ```python from django.db import models class Author(models.Model): name = models.CharField(max_length=100) def __str__(self): return self.name class Book(models.Model): title = models.CharField(max_length=200) authors = models.ManyToManyField(Author) def __str__(self): return self.title ``` 上述代码片段展示了如何通过`models.ManyToManyField()`方法创建Book与Author之间的一张中间表用于存储两者间的关联记录。 #### 添加数据到字段 当向数据库插入新书并指定其作者时,可以通过如下方式操作: ```python book = Book.objects.create(title="Effective Python") author1 = Author.objects.get(name='Brett Slatkin') author2 = Author.objects.get(name='David Beazley') book.authors.add(author1, author2) ``` 这里先获取已存在的两位作者实例对象,再调用`add()`函数将它们加入到某本特定图书所对应的authors集合当中去。 #### 查询关系中的数据 为了查询某一本书的所有作者或者某个作者参与编写的全部作品,可采用以下两种形式之一来进行检索: - **正向查找**:从Book出发找Authors; ```python my_book = Book.objects.get(id=1) for author in my_book.authors.all(): print(f"{author} wrote this book.") ``` - **反向查找**:由Author追溯至Books; ```python an_author = Author.objects.get(id=1) books_written_by_this_person = an_author.book_set.all() print(books_written_by_this_person) ``` 这两种遍历模式都利用到了自动生成功能强大的API接口,使得开发者能够轻松处理复杂的业务逻辑需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值