Model 模型

2 阅读4分钟

模型(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 操作和查询集,可以极大地提高开发效率。