django orm多对多
时间: 2025-01-02 15:31:49 浏览: 9
### 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接口,使得开发者能够轻松处理复杂的业务逻辑需求。
阅读全文