djnago orm 一对多关系使用

在 Django 中,一对多关系通常通过外键(ForeignKey)来实现。以下是一个完整的示例,展示如何定义模型、创建一对多关系,并使用 Django ORM 进行连表查询。

1. 定义模型

假设我们有两个模型:AuthorBook一个作者可以有多本书,这就是一对多的关系

models.py
python 复制代码
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField()

    def __str__(self):
        return self.name

class Book(models.Model):
    title = models.CharField(max_length=200)
    publication_date = models.DateField()
    author = models.ForeignKey(Author, related_name='books', on_delete=models.CASCADE)

    def __str__(self):
        return self.title

2. 创建和应用迁移

在定义好模型后,需要创建和应用数据库迁移。

bash 复制代码
python manage.py makemigrations
python manage.py migrate

3. 创建一些示例数据

你可以使用 Django 管理后台或 Django shell 来创建一些示例数据。

使用 Django shell
bash 复制代码
python manage.py shell
python 复制代码
from myapp.models import Author, Book

# 创建作者
author1 = Author.objects.create(name="Author One", email="author1@example.com")
author2 = Author.objects.create(name="Author Two", email="author2@example.com")

# 创建书籍
Book.objects.create(title="Book One", publication_date="2023-01-01", author=author1)
Book.objects.create(title="Book Two", publication_date="2023-02-01", author=author1)
Book.objects.create(title="Book Three", publication_date="2023-03-01", author=author2)

4. 连表查询

现在可以使用 Django ORM 进行连表查询。

views.py
python 复制代码
from django.shortcuts import render
from myapp.models import Author, Book

def author_books(request, author_id):
    # 获取指定作者
    author = Author.objects.get(id=author_id)
    
    # 获取该作者的所有书籍
    books = author.books.all()
    
    return render(request, 'author_books.html', {'author': author, 'books': books})
urls.py
python 复制代码
from django.urls import path
from myapp import views

urlpatterns = [
    path('author/<int:author_id>/', views.author_books, name='author_books'),
]
author_books.html
html 复制代码
<!DOCTYPE html>
<html>
<head>
    <title>Author Books</title>
</head>
<body>
    <h1>Books by {{ author.name }}</h1>
    <ul>
        {% for book in books %}
            <li>{{ book.title }} ({{ book.publication_date }})</li>
        {% endfor %}
    </ul>
</body>
</html>

5. 复杂查询示例

如果需要进行更复杂的查询,比如获取所有书籍及其对应的作者,可以使用 select_relatedprefetch_related

python 复制代码
def all_books(request):
    # 获取所有书籍及其对应的作者
    books = Book.objects.select_related('author').all()
    
    return render(request, 'all_books.html', {'books': books})
all_books.html
html 复制代码
<!DOCTYPE html>
<html>
<head>
    <title>All Books</title>
</head>
<body>
    <h1>All Books</h1>
    <ul>
        {% for book in books %}
            <li>{{ book.title }} by {{ book.author.name }} ({{ book.publication_date }})</li>
        {% endfor %}
    </ul>
</body>
</html>

6. 更新 urls.py

python 复制代码
urlpatterns = [
    path('author/<int:author_id>/', views.author_books, name='author_books'),
    path('books/', views.all_books, name='all_books'),
]
相关推荐
U盘失踪了35 分钟前
python curl转python脚本
开发语言·chrome·python
FQNmxDG4S38 分钟前
Java泛型编程:类型擦除与泛型方法的应用场景
java·开发语言·python
bzmK1DTbd1 小时前
JDBC编程规范:PreparedStatement与事务管理
数据库·python·eclipse
我星期八休息1 小时前
IT疑难杂症诊疗室:AI时代工程师Superpowers进化论
linux·开发语言·数据结构·人工智能·python·散列表
代码小书生1 小时前
math,一个基础的 Python 库!
人工智能·python·算法
leo825...1 小时前
Claude Code Skills 清单(本地)
java·python·ai编程
其实防守也摸鱼1 小时前
CTF密码学综合教学指南--第三章
开发语言·网络·python·安全·网络安全·密码学
A7bert7772 小时前
【YOLOv8pose部署至RDK X5】模型训练→转换bin→Sunrise 5部署
c++·python·深度学习·yolo·目标检测
gqk013 小时前
【无标题】
python
V搜xhliang02463 小时前
OpenClaw科研全场景用法:从文献到实验室的完整自动化方案
运维·开发语言·人工智能·python·算法·microsoft·自动化