模型与数据库的关系

模型与数据库的关系

在Django中,模型(Model)是与数据库交互的核心,理解模型与数据库的关系是开发Django应用的基础。本文将详细介绍Django模型与数据库的关系,并通过案例进行讲解。

Django模型简介

在Django中,模型是一个Python类,继承自django.db.models.Model。每个模型类对应数据库中的一张表,模型类的属性对应表中的字段。

创建模型示例

假设我们要创建一个简单的博客系统,我们需要一个Post模型来存储博客文章的信息。

1
2
3
4
5
6
7
8
9
from django.db import models

class Post(models.Model):
title = models.CharField(max_length=200) # 博客标题
content = models.TextField() # 博客内容
created_at = models.DateTimeField(auto_now_add=True) # 创建时间

def __str__(self):
return self.title

在上面的代码中:

  • title字段使用了CharField类型,限制最大长度为200。
  • content字段使用了TextField,用于存储文章的内容。
  • created_at字段使用了DateTimeField,并设置auto_now_add=True,在创建时自动设置为当前时间。

Django模型与数据库的关系

  1. 数据库表:每个模型类对应数据库中的一张表,Django会根据模型的定义生成相应的表。
  2. 字段:模型中的每个属性对应数据库表的一个字段,字段类型由Django的字段类定义。
  3. 主键:Django自动为每个模型提供一个主键id,这是一个自增的整型字段。

迁移 (Migration)

在定义好模型之后,需要将这些变化同步到数据库。Django使用迁移功能来管理模型和数据库之间的关系。

首先,生成迁移文件:

1
python manage.py makemigrations

然后,应用迁移以生成相应的数据库表:

1
python manage.py migrate

一对多关系示例

接下来我们来看一个一对多关系的示例。我们要为每个博客文章添加评论,评论可以由多个用户留下。

创建评论模型

1
2
3
4
5
6
7
8
class Comment(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE) # 关联到Post
user_name = models.CharField(max_length=100) # 用户名
content = models.TextField() # 评论内容
created_at = models.DateTimeField(auto_now_add=True) # 创建时间

def __str__(self):
return f"{self.user_name} on {self.post.title}"

Comment模型中:

  • post字段使用了ForeignKey,表示每条评论都属于一个Poston_delete=models.CASCADE表示当Post被删除时,相关的评论也会被删除。
  • user_name字段存储评论者的姓名,content存储评论内容。

迁移和数据插入

同样,需要迁移评论模型:

1
2
python manage.py makemigrations
python manage.py migrate

插入数据示例:

1
2
3
4
5
6
# 创建一篇新文章
post = Post.objects.create(title='My First Post', content='This is the content of my first post.')

# 给文章添加评论
Comment.objects.create(post=post, user_name='Alice', content='Great post!')
Comment.objects.create(post=post, user_name='Bob', content='Thanks for sharing!')

通过以上代码,我们不仅创建了一篇新的博客文章,还为其添加了两条评论。

小结

在本小节中,我们学习了Django中的模型如何与数据库表对应,以及如何通过简单的关系(如一对多)来构建功能。通过实际的案例,我们看到了如何定义模型、生成迁移、并插入数据。掌握这些基本知识后,你将能够在Django中使用模型来存储和管理数据。

14 Django 数据库迁移实战教程

14 Django 数据库迁移实战教程

在Django中,迁移数据库是一项重要的操作。它允许你在更改模型后,将更新应用到数据库中。本节将详细介绍如何在Django中进行数据库迁移,结合实际案例。

什么是迁移?

迁移是Django中用于跟踪和应用数据库模式更改的工具。当你对模型进行修改(如添加字段、删除字段、改变字段类型等)时,你需要通过迁移将这些更改反映到数据库中。

创建模型

首先,让我们创建一个简单的模型。在我们的案例中,我们将创建一个用于记录书籍信息的模型:

1
2
3
4
5
6
7
8
9
10
from django.db import models

class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=100)
published_date = models.DateField()
isbn_number = models.CharField(max_length=13)

def __str__(self):
return self.title

将上面的代码放入你的应用的 models.py 文件中。

创建迁移

添加模型后,你需要创建迁移来更新数据库。可以使用以下命令来生成迁移文件:

1
python manage.py makemigrations

运行这个命令后,Django会自动检测到模型的变化,并生成一个新的迁移文件。输出将类似于:

1
2
3
Migrations for 'your_app_name':
your_app_name/migrations/0001_initial.py
- Create model Book

在上面的输出中,0001_initial.py 是自动生成的迁移文件名。

应用迁移

迁移文件创建后,你需要将这些更改应用到数据库中。使用以下命令执行迁移:

1
python manage.py migrate

这条命令会将在之前生成的迁移文件应用到数据库,创建相应的表和字段。

查看当前迁移状态

如果你想查看当前的迁移状态,可以使用以下命令:

1
python manage.py showmigrations

该命令将显示所有应用的迁移和他们的状态(已应用或未应用)。

修改模型

现在假设我们想要在 Book 模型中添加一个 price 字段。我们将更新模型如下:

1
2
3
4
5
6
7
8
9
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=100)
published_date = models.DateField()
isbn_number = models.CharField(max_length=13)
price = models.DecimalField(max_digits=5, decimal_places=2) # 新增字段

def __str__(self):
return self.title

然后,运行 makemigrations 命令:

1
python manage.py makemigrations

Django将检测到模型的变化,并生成新的迁移文件。接着,应用这些迁移:

1
python manage.py migrate

删除字段

如果我们决定删除 isbn_number 字段,可以从模型中移除该字段:

1
2
3
4
5
6
7
8
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=100)
published_date = models.DateField()
price = models.DecimalField(max_digits=5, decimal_places=2)

def __str__(self):
return self.title

再次运行迁移命令:

1
2
python manage.py makemigrations
python manage.py migrate

Django将创建迁移以反映这个字段的删除并运用到数据库中。

总结

在本节中,我们介绍了如何在Django中进行数据库迁移。以下是操作的基本步骤:

  1. 创建或修改模型
  2. 使用 makemigrations 命令生成迁移文件
  3. 使用 migrate 命令将迁移应用到数据库
  4. 使用 showmigrations 查看迁移状态

通过这些步骤,你可以轻松地管理Django应用中的数据库结构。始终记得在每次修改模型后,都要进行相应的迁移操作,以保持数据结构的同步。

15 定义视图函数

15 定义视图函数

在Django中,视图函数是将请求与响应连接起来的关键部分。它们负责处理用户请求并返回相应的内容。在这一小节中,我们将通过具体案例来详细了解如何定义视图函数。

创建基本视图函数

一个视图函数是一个普通的Python函数,接收一个HttpRequest对象并返回一个HttpResponse对象。下面是一个简单的示例:

1
2
3
4
from django.http import HttpResponse

def hello_world(request):
return HttpResponse("Hello, world!")

在这个例子中,hello_world函数处理请求并返回一段简单的文本。

将视图函数映射到URL

为了使我们的视图函数能够响应特定的URL请求,我们需要在urls.py文件中进行配置。下面是如何将视图函数映射到URL的步骤:

  1. 打开你的 Django 应用的 urls.py 文件。
  2. 导入视图函数。
  3. 添加 URL 模式。

以下是完整的示例:

1
2
3
4
5
6
from django.urls import path
from .views import hello_world

urlpatterns = [
path('hello/', hello_world, name='hello_world'),
]

现在,当用户访问 /hello/ URL 时,hello_world 视图函数将被调用,并返回 “Hello, world!”。

视图函数接收参数

视图函数不仅可以处理基本请求,还可以接收 URL 参数。下面是一个接受用户名称的视图函数的示例:

1
2
def greet_user(request, username):
return HttpResponse(f"Hello, {username}!")

urls.py 中,我们将相应的 URL 配置为:

1
2
3
urlpatterns = [
path('greet/<str:username>/', greet_user, name='greet_user'),
]

现在,如果一个用户访问 /greet/John/,服务器将返回 “Hello, John!”。

使用模板渲染视图

视图函数还可以使用 Django 的模板系统返回更复杂的 HTML 响应。以下是如何做到这一点的示例:

  1. 首先,确保你有一个 HTML 模板文件,例如 greet.html,其内容如下:
1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Greeting</title>
</head>
<body>
<h1>Hello, {{ username }}!</h1>
</body>
</html>
  1. 然后,在你的视图函数中使用 render 方法来渲染这个模板:
1
2
3
4
from django.shortcuts import render

def greet_user(request, username):
return render(request, 'greet.html', {'username': username})
  1. 更新 urls.py 文件:
1
2
3
urlpatterns = [
path('greet/<str:username>/', greet_user, name='greet_user'),
]

现在,当用户访问 /greet/John/ 时,系统将返回一个包含“Hello, John!”消息的 HTML 页面。

处理表单提交

视图函数还可以处理用户提交的表单。以下是一个基本的示例:

  1. 创建一个简单的 HTML 表单,例如 name_form.html
1
2
3
4
5
6
<form method="post">
{% csrf_token %}
<label for="name">Enter your name:</label>
<input type="text" id="name" name="name">
<button type="submit">Submit</button>
</form>
  1. 创建视图函数来处理表单提交:
1
2
3
4
5
6
7
from django.shortcuts import render

def name_form(request):
if request.method == 'POST':
name = request.POST.get('name')
return HttpResponse(f"Hello, {name}!")
return render(request, 'name_form.html')
  1. urls.py 中更新配置:
1
2
3
urlpatterns = [
path('name/', name_form, name='name_form'),
]

现在,用户可以通过访问 /name/ 提交他们的姓名,系统将返回包含姓名的问候信息。

总结

在本小节中,我们学习了如何在 Django 中定义视图函数,以及如何将其映射到 URL。我们还探讨了如何接收 URL 参数、使用模板渲染响应和处理表单提交。掌握视图函数的定义与使用是构建 Django 应用的基础。