目录
1. 什么是 Django 模型?
Django 模型是应用程序与数据库交互的桥梁。它定义了数据库中表的结构,并封装了与数据库交互的操作。模型类是 Django 中的核心概念之一,通常是继承自 django.db.models.Model
类。
模型的作用
- 定义数据结构:在数据库中创建表。
- 提供数据操作接口:通过 ORM (对象关系映射) 提供操作数据的接口,简化数据库操作。
- 数据验证:模型自动进行数据验证,确保数据的完整性。
2. 创建 Django 模型
2.1 创建应用
首先,确保你已经创建了一个 Django 项目和一个应用。如果没有,可以通过以下命令创建应用:
python manage.py startapp myapp
2.2 定义模型
在应用的 models.py
文件中定义模型。例如,创建一个表示 文章 的模型:
# myapp/models.py
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200) # 标题,最大长度 200
content = models.TextField() # 内容,长文本
published_date = models.DateTimeField(auto_now_add=True) # 发布日期
is_published = models.BooleanField(default=True) # 是否发布
def __str__(self):
return self.title # 返回文章标题作为显示名称
在这个模型中,我们定义了 4 个字段:
title
: 用CharField
存储文章标题。content
: 用TextField
存储文章内容。published_date
: 用DateTimeField
存储文章的发布时间,auto_now_add=True
会在创建时自动填充时间。is_published
: 用BooleanField
表示文章是否发布。
3. 字段类型
Django 提供了多种字段类型,常用的有:
- CharField: 用于存储小段文本(如标题)。
- TextField: 用于存储长文本(如文章内容)。
- IntegerField: 存储整数。
- DateTimeField: 存储日期和时间。
- BooleanField: 存储布尔值(True/False)。
- DecimalField: 用于存储精确的十进制数。
- FloatField: 用于存储浮动点数。
完整的字段类型可以参考 Django 文档。
4. 模型迁移
一旦你定义了模型,需要使用迁移来生成数据库表并同步模型和数据库结构。
4.1 创建迁移文件
运行以下命令生成模型的迁移文件:
python manage.py makemigrations
该命令会检查你的 models.py
文件中的变化,并生成迁移文件。
4.2 应用迁移
将迁移应用到数据库:
python manage.py migrate
这会创建数据库表和字段,确保数据库与模型同步。
5. 模型查询与管理
Django 提供了强大的 ORM 查询功能,允许你以面向对象的方式操作数据库。
5.1 使用模型进行查询
获取所有文章
articles = Article.objects.all()
获取一篇特定的文章
article = Article.objects.get(id=1)
筛选已发布的文章
published_articles = Article.objects.filter(is_published=True)
排序
ordered_articles = Article.objects.all().order_by('published_date') # 按时间升序
5.2 管理器
Django 的管理器允许我们为模型添加自定义的查询方法。可以通过定义模型的 objects
属性来指定一个自定义的管理器。
class ArticleManager(models.Manager):
def published(self):
return self.filter(is_published=True)
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
published_date = models.DateTimeField(auto_now_add=True)
is_published = models.BooleanField(default=True)
objects = ArticleManager() # 使用自定义管理器
def __str__(self):
return self.title
这样,你就可以调用 Article.objects.published()
来获取所有已发布的文章。
6. 模型关系
Django 支持多种数据库关系,包括一对一(One-to-One)、一对多(ForeignKey)和多对多(ManyToMany)关系。
6.1 外键(ForeignKey)
外键表示一对多关系。例如,一个 Author
模型与 Article
模型之间的关系:
class Author(models.Model):
name = models.CharField(max_length=100)
class Article(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
在上面的例子中,一个作者(Author
)可以有多篇文章(Article
),但每篇文章只能有一个作者。
6.2 多对多关系(ManyToMany)
多对多关系表示多个对象与多个对象之间的关系。例如,Article
和 Category
之间的关系:
class Category(models.Model):
name = models.CharField(max_length=100)
class Article(models.Model):
title = models.CharField(max_length=200)
categories = models.ManyToManyField(Category)
每篇文章可以有多个类别,而每个类别也可以包含多个文章。
7. 常见问题与解决方案
1. 模型迁移后数据库表没有更新
- 确保运行了
makemigrations
和migrate
命令。 - 检查
models.py
中是否有未保存的更改。
2. 查询出错,模型没有对应的表
- 检查数据库中是否有与模型对应的表。
- 如果表没有创建,确保迁移已正确应用,并检查数据库连接设置。
3. 多对多关系无法保存数据
- 确保已正确调用
save()
方法保存模型实例。 - 多对多关系需要通过关联表保存关联数据。
发表回复