在 Django 中,ORM(对象关系映射)是一个关键概念,它允许你通过使用 Python 类来定义数据库模型,而不需要直接编写 SQL 查询语句。Django 的 ORM 提供了一种将 Python 对象与数据库表之间进行映射的方式,使得数据库操作变得更加简单和直观。
数据库的选定
Django 支持多种数据库后端,包括 MySQL、PostgreSQL、SQLite 等。你可以在项目的配置文件(settings.py)中指定所需的数据库类型和连接信息。
通常情况下,只需要修改以下设置:
# settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3', # 选择数据库引擎
'NAME': BASE_DIR / 'db.sqlite3', # 数据库文件路径(这里使用SQLite作为示例)
}
}
若 mysql 配置如下:
DATABASES = {
'default':
{
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'mysite', # 数据库名称
'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1
'PORT': 3306, # 端口
'USER': 'root', # 数据库用户名
'PASSWORD': '123456', # 数据库密码
}
}
mysql 使用需要安装三方客户端库,如下:
pip install pymysql
Django 也深度支持 PostgreSQL,配置示例如下:
# Database
# https://docs.djangoproject.com/en/4.2/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql', # 数据库引擎
'NAME': 'mypostgresql', # 数据库名,Django 不会帮你创建,需要自己进入数据库创建。
'USER': 'postgres', # 设置的数据库用户名
'PASSWORD': '123456', # 设置的密码
'HOST': '127.0.0.1', # 本地主机或数据库服务器的 ip,不设置默认本地,即 localhost
# 'PORT': '5432', # 数据库使用的端口,不设置默认 5432
}
}
PostgreSQL python client 库需要安装类似如下三方库:
pip install psycopg==3.1.9
请注意,对于 SQLite 来说,不需要额外安装 Python 客户端,因为 SQLite 是一个嵌入式数据库,它是 Django 的默认数据库后端,并且不需要单独的服务器或客户端。
对于 MySQL 和 PostgreSQL,你需要根据你的项目需要选择相应的 Python 客户端并安装它们。一般情况下,当你在 settings.py
中选择数据库后端时(通过 'ENGINE'
字段),Django 会自动根据所选后端加载相应的 Python 客户端库。
模型定义及模型类
在 Django 中,每个数据库表都由一个 Python 类来表示,该类继承自 django.db.models.Model
。这个类的属性代表数据库表的字段,而类的方法则用于定义表之间的关系或自定义查询逻辑。
假设我们要创建一个简单的博客应用,包含两个模型: Author
(作者)和 Post
(文章)。其中,Post
模型将包含一个外键字段,与 Author
模型建立关系。代码示例如下:
# models.py
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
def __str__(self):
return self.name
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
pub_date = models.DateTimeField()
author = models.ForeignKey(Author, on_delete=models.CASCADE)
def __str__(self):
return self.title
在上面的代码中,我们定义了两个模型类: Author
和 Post
。它们分别对应数据库中的两张表,每个类的属性定义了表的字段。
表名的定义
Django 默认会将模型类的名称作为数据库表名,但是你也可以通过在模型类中定义 Meta
类来指定自定义的表名。例如,如果我们想将 Author
模型映射到数据库中的 authors
表,代码示例如下:
# models.py
class Author(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
def __str__(self):
return self.name
class Meta:
db_table = 'authors'
字段的定义
上述示例中,我们使用了几种常见的字段类型:
CharField
:用于定义字符型字段,参数max_length
指定字段的最大长度。EmailField
:用于定义邮箱字段,会验证输入是否为合法的邮箱地址。TextField
:用于定义文本字段,可以存储较长的文本内容。DateTimeField
:用于存储日期和时间信息。
Django 提供了多种其他字段类型,如整数、浮点数、布尔值、图片等。你可以根据具体需求选择合适的字段类型。
元数据(Meta)
在模型类中,Meta
类允许你定义一些额外的元数据,用于配置模型的行为。例如,我们可以通过 ordering
属性指定查询结果的默认排序方式:
# models.py
class Post(models.Model):
# ...
class Meta:
ordering = ['-pub_date'] # 按照 pub_date 字段降序排列
在上述示例中,我们指定了 Post
模型的默认排序方式为按照 pub_date
字段的降序排列。
综述
Django 的 ORM 提供了一种便捷的方式来定义数据库模型和执行数据库操作。通过简单的 Python 类和字段定义,你可以轻松地与数据库交互,而无需直接编写 SQL 语句。以上代码示例展示了数据库的选定与配置、模型的定义、表名的指定、字段的使用以及元数据的配置,希望对你理解 Django 中的 ORM 有所帮助。