目录

  1. 什么是 Django 模型?
  2. 创建 Django 模型
  3. 字段类型
  4. 模型迁移
  5. 模型查询与管理
  6. 模型关系
  7. 常见问题与解决方案
  8. 参考资料

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)

多对多关系表示多个对象与多个对象之间的关系。例如,ArticleCategory 之间的关系:

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. 模型迁移后数据库表没有更新

  • 确保运行了 makemigrationsmigrate 命令。
  • 检查 models.py 中是否有未保存的更改。

2. 查询出错,模型没有对应的表

  • 检查数据库中是否有与模型对应的表。
  • 如果表没有创建,确保迁移已正确应用,并检查数据库连接设置。

3. 多对多关系无法保存数据

  • 确保已正确调用 save() 方法保存模型实例。
  • 多对多关系需要通过关联表保存关联数据。

8. 参考资料

出站链接

站内链接