模型(Models)
Django 的模型(Model)是数据与数据库表的抽象映射,用于定义数据库结构,并通过 Django 的 ORM(对象关系映射)进行操作。模型定义通常存放在应用的models.py
文件中。
1. 定义模型类
在 Django 中,模型是一个 Python 类,需要继承 django.db.models.Model
。类的每个属性对应数据库中的一个字段。
示例:创建一个博客文章模型
from django.db import models
class BlogPost(models.Model):
title = models.CharField(max_length=200) # 标题
content = models.TextField() # 文章内容
author = models.CharField(max_length=100) # 作者
created_at = models.DateTimeField(auto_now_add=True) # 创建时间
updated_at = models.DateTimeField(auto_now=True) # 更新时间
is_published = models.BooleanField(default=True) # 是否发布
def __str__(self):
return self.title # 返回对象的字符串表示
在定义模型后,Django 会自动将该类映射为数据库中的一张表,每个属性都会成为数据库表中的一个字段。
2. 字段类型
Django 提供了丰富的字段类型来定义数据库表结构。以下是常见字段类型:
(1)文本和字符串
字段类型 | 说明 |
---|---|
CharField(max_length=255) | 字符串字段,必须指定 max_length |
TextField() | 长文本字段,适用于文章内容 |
SlugField() | 适用于 SEO 友好的 URL 片段 |
示例
title = models.CharField(max_length=200)
content = models.TextField()
slug = models.SlugField(unique=True)
(2)数值字段
字段类型 | 说明 |
---|---|
IntegerField() | 整数 |
FloatField() | 浮点数 |
DecimalField(max_digits=10, decimal_places=2) | 十进制浮点数 |
PositiveIntegerField() | 只能存储正整数 |
示例
views = models.IntegerField(default=0)
price = models.DecimalField(max_digits=10, decimal_places=2)
(3)日期和时间字段
字段类型 | 说明 |
---|---|
DateField(auto_now_add=True) | 仅存储日期,不含时间 |
DateTimeField(auto_now_add=True) | 存储日期时间,auto_now_add=True 在创建时自动填充 |
TimeField() | 仅存储时间 |
示例
created_at = models.DateTimeField(auto_now_add=True) # 记录创建时间
updated_at = models.DateTimeField(auto_now=True) # 记录更新时间
(4)布尔字段
字段类型 | 说明 |
---|---|
BooleanField(default=True) | 存储 True/False |
示例
is_active = models.BooleanField(default=True)
(5)关系字段
Django 提供了三种主要的关系字段:
字段类型 | 说明 |
---|---|
ForeignKey() | 一对多关系 |
OneToOneField() | 一对一关系 |
ManyToManyField() | 多对多关系 |
示例
class Author(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField(unique=True)
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE) # 一对多
genres = models.ManyToManyField('Genre') # 多对多
on_delete=models.CASCADE
:当Author
被删除时,Book
也会被删除。ManyToManyField
允许一个Book
属于多个Genre
,反之亦然。
3. 迁移数据库
在创建或修改模型后,需要运行数据库迁移:
python manage.py makemigrations # 生成迁移文件
python manage.py migrate # 应用迁移到数据库
4. 数据库操作(CRUD)
Django 提供了 ORM(对象关系映射)来执行数据库操作,无需编写 SQL 语句。
(1)创建数据
from myapp.models import BlogPost
post = BlogPost(title="Django 教程", content="Django 是一个 Web 框架", author="Admin")
post.save() # 保存到数据库
或者使用 create()
方法:
BlogPost.objects.create(title="Django 教程", content="Django ORM 介绍", author="Admin")
(2)读取数据
获取所有数据:
posts = BlogPost.objects.all()
获取特定数据:
post = BlogPost.objects.get(id=1) # 通过 ID 获取
使用过滤查询:
published_posts = BlogPost.objects.filter(is_published=True)
获取最新数据:
latest_post = BlogPost.objects.latest('created_at')
(3)更新数据
post = BlogPost.objects.get(id=1)
post.title = "Django 高级教程"
post.save() # 保存更改
或者批量更新:
BlogPost.objects.filter(is_published=False).update(is_published=True)
(4)删除数据
post = BlogPost.objects.get(id=1)
post.delete() # 删除该记录
或者批量删除:
BlogPost.objects.filter(is_published=False).delete()
5. 查询集(QuerySet)
Django 的 QuerySet 允许你对数据库执行复杂查询:
方法 | 说明 |
---|---|
.all() | 获取所有记录 |
.filter() | 过滤数据 |
.exclude() | 排除数据 |
.order_by() | 排序数据 |
.values() | 仅获取指定字段 |
.distinct() | 获取唯一值 |
.count() | 统计数量 |
.first() / .last() | 获取第一条 / 最后一条记录 |
示例
# 查询所有已发布的文章
BlogPost.objects.filter(is_published=True)
# 查询标题包含"Django"的文章
BlogPost.objects.filter(title__icontains="Django")
# 排序
BlogPost.objects.order_by('-created_at') # 按创建时间降序
6. 关系查询
Django ORM 允许你通过关系字段进行跨表查询:
# 获取某个作者的所有书籍
author = Author.objects.get(name="张三")
books = author.book_set.all() # 反向查询
多对多查询
# 获取某个分类的所有书籍
genre = Genre.objects.get(name="科技")
books = genre.book_set.all()
总结
Django 的模型是数据库的抽象层,它允许开发者使用 Python 代码直接操作数据库,无需手写 SQL 语句。掌握模型定义、字段类型、CRUD 操作和查询集,可以极大地提高开发效率。